46

谁能解释someViewController.delegate = selfand的含义self.delegate?他们在哪里帮助我们?

4

3 回答 3

101

代表向您发送消息

例如:如果您使用加速度计委托,您将收到有关加速度计的消息。

如果您使用新的中微子检测委托,您将收到有关在该区域检测到的任何中微子的消息。

如果您使用 PopUps,PopUps 会向您发送消息。完成的方式是使用 PopUp 的代表。有很多很多例子。

因此,代表发送消息。

就是这么简单。

你可能会问,“它在哪里发送这些消息?”

答案是这样的:它将消息发送到您设置“.delegate”事物的位置。

当您“设置委托”时,您所做的就是说明您希望消息去往何处。

因此,

blah.delegate = AmazingPlace 会将消息发送到“amazingPlace”。

blah.delegate =somewhereElse 将消息发送到“somewhereElse”。

blah.delegate = self 将发送消息...... 给你

很多时候,您希望消息发送给“您”,因此您只需说“blah.delegate = self”

忘记那行代码是一个非常常见的错误。

如果你忘记了那行代码,你就被塞满了。消息无处可去,您只能摸不着头脑,试图找出问题所在。

你必须做的其他事情:当你使用委托时,你必须事先宣布,你想使用委托。

怎么做?

这很容易...

在过去使用 Objective-C...

// old days!
@interface AppDelegate_Pad : NSObject <UIApplicationDelegate>
@interface BigTop : UIViewController <ASIHTTPRequestDelegate,
                                        UIPopoverControllerDelegate>
@interface Flying : UIViewController <UIAccelerometerDelegate>

您可以看到“BigTop”想要使用两个委托,即 ASIHTTPRequestDelegate 和 UIPopoverControllerDelegate。而“飞行”只想使用一名代表 - 它想使用加速度计。

在斯威夫特...

 class YourClass:UIViewController, SomeDelegate, AnotherDelegate

如果不到处使用委托,你就无法在 iPhone 上做很多事情。

在 iOS 中,委托无处不在,并且一直在使用。

一个类可能使用十几个代表是完全正常的。也就是说,您的班级将希望从十几个代表那里获得消息。

现在使用 Swift 你只需输入

  blah.delegate = self

这就是它的全部。

这就是你正在做的事情。代表发送消息。您必须说出您希望消息发送到哪里非常典型地,您希望他们去找“您”,所以在这种情况下,您只需说blah.delegate=self.

于 2010-11-18T08:47:30.127 回答
-2

Delegate用于传递/通信数据/消息 b/w 类的两个对象。在这里, (发送者)向(接收者)tableView发送数据/消息。viewController考虑UITableView在自定义viewController Here 中实现的示例,UITableViewDataSource&UITableViewDelegate实际上是协议。可惜UIKit Framework不是开源的。但我会保证在参考了许多文章后内部会发生什么。

协议就像篮球教练,里面有一些要求。what to do?他/她通过使用这些要求告诉玩家类、结构、枚举等。但他/她doesn't knows how to do?自己。因此,符合该协议的类或结构应该提供对这些要求的实现,同时实现扣球。

protocol UITableViewDelegate {
 func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
}

协议被称为 DataSource 协议,那么它总是包含具有“返回类型”的所需函数,如下所示。

protocol UITableViewDataSource {
 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
 func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
}

在自定义 viewController 中实现 UITableView

class viewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    let tableView = UITableView()    

    override func viewDidLoad {
      tableView.delegate = self
      tableView.dataSource = self
    }

在这里,tableView充当委托人(发送者)和viewController object i.e (self)委托人(接收者)。

为了进入UITableViewviewController它应该符合这两个协议。

因此,viewController类对象已经实现了这两种协议的所有必需功能。现在self可以用作UITableViewDelegate类型或UITableViewDataSource类型,因为协议可以用作符合它的类对象的类型。现在,tableViewie delegate&的两个属性dataSource都被分配,self因为它具有相同的各自协议类型。

两个协议的非可选功能都在viewController类对象中实现,如下所示

协议UITableViewDelegate功能

func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
// Do further processes like pushing or poping another viewController
}

协议UITableViewDataSource功能

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 10
 }

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    return UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell")
 }

1)当用户在一个部分中选择一行时,tableview(Sender)即通过将数据传递给参数&来UItableView()调用UITableViewDelegate下面显示的函数,该参数通过其属性驻留在对象(Receiver)中。现在使用这些传递的数据来做进一步的过程,比如推送或弹出到新的自定义 viewController。tableViewindexPathviewControllerdelegateviewController

tableView.delegate?.tableView(UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

2)协议内部的函数向(Sender)UITableViewDatasource提供自定义数据。tableview通过调用 Datasource 函数并将数据传递给参数&通过其属性驻留在object(Receiver)中来tableview询问对象。现在使用那些传递的数据并返回自定义数据。现在使用这些数据在 indexpath 的一个部分和一种“单元格”中创建“10”个单元格viewControllertableViewindexPathviewControllerdatasourceviewControllertableviewtableview

tableView.dataSource?.tableView(UITableView, numberOfRowsInSection section: Int) -> returns "10"

tableView.dataSource?.tableView(UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> returns "cell"

最后,整体UIKit Framework在其所有类中使用委托和数据源设计模式,例如UIApplicationUITableViewUICollectionViewUITextField来传递数据。可惜UIKit Framework不是开源的。

于 2018-01-02T23:27:14.077 回答
-3

如果在任何情况下,Bourne 的回答都没有帮助.. 委托基本上是事件对对象的反应,并且说“.delegate=self”意味着这些协议已在 self 中被采用......例如......当tableview 的委托方法“didSelectRowAtIndexPath”告诉在 tableview 中选择了一行......如果视图控制器有一个 tableview ..并且“didSelectRowAtIndexPath”只在该视图控制器中定义,那么我们会说...... tableview.delegate = self” ...而“self.anything”用于表示“anything”是 self 的一个属性。例如 NSString* 任何东西;@property(nonatomic,retain) NSString* 任何东西;

然后是“self.anything”

于 2010-11-18T07:25:21.080 回答