谁能解释someViewController.delegate = self
and的含义self.delegate
?他们在哪里帮助我们?
3 回答
代表向您发送消息。
例如:如果您使用加速度计委托,您将收到有关加速度计的消息。
如果您使用新的中微子检测委托,您将收到有关在该区域检测到的任何中微子的消息。
如果您使用 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
.
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)
委托人(接收者)。
为了进入UITableView
。viewController
它应该符合这两个协议。
因此,viewController
类对象已经实现了这两种协议的所有必需功能。现在self
可以用作UITableViewDelegate
类型或UITableViewDataSource
类型,因为协议可以用作符合它的类对象的类型。现在,tableView
ie 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。tableView
indexPath
viewController
delegate
viewController
tableView.delegate?.tableView(UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
2)协议内部的函数向(Sender)UITableViewDatasource
提供自定义数据。tableview
通过调用 Datasource 函数并将数据传递给参数&通过其属性驻留在object(Receiver)中来tableview
询问对象。现在使用那些传递的数据并返回自定义数据。现在使用这些数据在 indexpath 的一个部分和一种“单元格”中创建“10”个单元格viewController
tableView
indexPath
viewController
datasource
viewController
tableview
tableview
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 中选择了一行......如果视图控制器有一个 tableview ..并且“didSelectRowAtIndexPath”只在该视图控制器中定义,那么我们会说...... tableview.delegate = self” ...而“self.anything”用于表示“anything”是 self 的一个属性。例如 NSString* 任何东西;@property(nonatomic,retain) NSString* 任何东西;
然后是“self.anything”