【发布时间】:2011-05-11 20:22:18
【问题描述】:
谁能解释someViewController.delegate = self和self.delegate的含义?他们在哪里帮助我们?
【问题讨论】:
标签: objective-c cocoa delegates protocols delegation
谁能解释someViewController.delegate = self和self.delegate的含义?他们在哪里帮助我们?
【问题讨论】:
标签: objective-c cocoa delegates protocols delegation
代表向您发送消息。
例如:如果您使用加速度计委托,您将收到有关加速度计的消息。
如果您使用新的中微子检测委托,您将收到有关在该区域检测到的任何中微子的消息。
如果您使用 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。而“飞行”只想使用一名代表 - 它想使用加速度计。
在 Swift 中...
class YourClass:UIViewController, SomeDelegate, AnotherDelegate
如果不到处使用委托,你真的无法在 iPhone 上做很多事情。
在 iOS 中,委托无处不在,无时无刻不在使用。
一个类可能使用十几个委托是完全正常的。也就是说,你的班级会想要从十几个代表那里得到消息。
现在使用 Swift 你只需输入
blah.delegate = self
仅此而已。
这就是你正在做的事情。代表发送消息。您必须说出您希望消息发送到的何处。通常情况下,您希望他们找到“您”,因此在这种情况下您只需说 blah.delegate=self。
【讨论】:
self时会发生什么)
Delegate 用于传递/通信数据/消息 b/w 两个类对象。在这里,tableView(Sender) 向viewController(Receiver) 发送数据/消息。
考虑在自定义viewController 中实现UITableView 的示例
这里,UITableViewDataSource & UITableViewDelegate 实际上是协议。不幸的是,UIKit Framework 不是开源的。但我会在参考许多文章后向内部保证这一点。
协议就像篮球教练,里面有一些要求。他/她通过使用这些要求告诉玩家诸如类、结构、枚举what to do?。但他/她doesn't knowshow to do?自己。因此,符合该协议的类或结构应该在实现扣球的同时提供这些要求的实现。
protocol UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
}
Protocol 被称为 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) 充当委托人(接收者)。
为了在viewController中获得UITableView。它应该符合这两个协议。
所以,viewController 类对象已经实现了这两种协议的所有必需功能。现在self 可以用作UITableViewDelegate 类型或UITableViewDataSource 类型,因为Protocol 可以用作符合它的类对象的类型。
现在,tableView 的两个属性,即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() 通过将数据传递给位于@987654357 中的参数tableView 和indexPath 调用下面所示的UITableViewDelegate 函数@object(Receiver) 通过其delegate 属性。现在viewController 使用这些传递的数据进行进一步的处理,例如推送或弹出到新的自定义视图控制器。
tableView.delegate?.tableView(UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
2) UITableViewDatasource 协议中的函数向tableview(Sender) 提供自定义数据。 tableview 通过调用 Datasource 函数将数据传递给参数 tableView 和 indexPath 来询问 viewController 对象,该参数通过其 datasource 属性驻留在 viewController object(Receiver) 中。现在viewController 使用那些传递的数据并将自定义数据返回tableview。现在tableview 使用这些数据在 indexpath 的一个部分中创建“10”个单元格和一种“单元格”
tableView.dataSource?.tableView(UITableView, numberOfRowsInSection section: Int) -> returns "10"
tableView.dataSource?.tableView(UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> returns "cell"
最后,整个UIKit Framework 在其所有类中使用委托和数据源设计模式,例如UIApplication、UITableView、UICollectionView、UITextField 等来传递数据。不幸的是,UIKit Framework 不是开源的。
【讨论】:
如果在任何情况下 Bourne 的回答都没有帮助.. 委托基本上是事件对对象的反应,并且说“.delegate=self”意味着这些协议已在 self 中被采用......例如.. tableview 的委托方法“didSelectRowAtIndexPath”告诉在 tableview 中选择一行时会发生什么......并且如果 viewcontroller 有一个 tableview .. 并且“didSelectRowAtIndexPath”在该视图控制器中定义,然后我们会说... tableview.delegate = self“... 而“self.anything”用来表示“anything”是self的一个属性。 例如。 NSString* 任何东西; @property(nonatomic,retain) NSString* 任何东西;
然后是“self.anything”
【讨论】: