有人能解释someViewController.delegate = self
和self.delegate
的含义吗?他们在哪里帮助我们?
答案 0 :(得分:85)
委派向您发送消息。
例如:如果您使用加速计代表,您将收到有关加速度计的消息。
如果您使用新的中微子检测代表,您将收到有关该区域内检测到的任何中微子的消息。
如果您使用PopUps,PopUps会向您发送消息。完成的方式是使用PopUp的委托。有许多例子。
因此,代表们发送消息。
就这么简单。
您可能会问,“它在哪里发送这些消息?”
答案是:它将消息发送到您设置“.delegate”的地方。
当你“设置代表”时,你正在做的是说你想要消息的去向。
因此,
blah.delegate = amazingPlace会将消息发送到“amazingPlace”。
blah.delegate = somewhereElse会将消息发送到“somewhereElse”。
blah.delegate = self会发送消息...... 给你 。
很多时候,你希望消息来到“你”,所以你只要说“blah.delegate = self”
忘记这行代码是一个非常常见的错误。
如果你忘了那行代码,你就被塞满了。这些消息无处,你仍在试图弄清楚出了什么问题。
你需要做的其他事情:当你使用委托时,你必须事先宣布,你想要使用委托。
怎么做?
在Objective-c的旧时代,你刚刚做到了......
@interface AppDelegate_Pad : NSObject <UIApplicationDelegate>
@interface BigTop : UIViewController <ASIHTTPRequestDelegate,
UIPopoverControllerDelegate>
@interface Flying : UIViewController <UIAccelerometerDelegate>
你可以看到'BigTop'想要使用两个委托,即ASIHTTPRequestDelegate和UIPopoverControllerDelegate。而'Flying'只想使用一个代表 - 它想要使用加速度计。
在Swift 中,它可能更容易 - 你只需要一个逗号然后是协议:
class YourClass:UIViewController, SomeDelegate, AnotherDelegate
如果没有在整个地方使用代表,你就无法在iPhone上做太多事情。
代表随处可见,并且一直在iOS中使用。
一个班级可能会使用十几个代表是完全正常的。
在上面的“飞行”的例子中,在“飞行”代码的某处,它不得不说......
[[UIAccelerometer sharedAccelerometer] setDelegate:self];
对于BigTop,它必须在ASIHttpRequests的某处设置委托,
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:gid forKey:@"gid"];
[request setPostValue:nom forKey:@"nom"];
[request setDelegate:self];
(过去不要忘记使用objective-c,x.delegate=self
与[x setDelegate:self]
完全相同。)
现在使用Swift ,只需输入
即可 x.delegate = self
这就是它的全部内容。
这就是你正在做的事情。代表发送消息。你必须说哪里你想要消息。通常情况下,您希望他们转到“您”,因此在这种情况下,您只需说x.delegate=self
。
希望它有所帮助。
答案 1 :(得分:-1)
Prelude
用于传递/传递数据/消息b / w两个类对象。在这里,Data.List
(发件人)将数据/消息发送到Delegate
(接收方)。
考虑在自定义tableView
中实施viewController
的示例
在这里,UITableView
&amp; viewController
实际上是协议。不幸的是,UITableViewDataSource
不是开源的。但是我会在参考很多文章之后向我们保证内部会发生什么。
协议就像篮球教练,有一些要求。他/她通过使用这些要求告诉玩家类,结构,枚举UITableViewDelegate
。但他/她UIKit Framework
what to do?
由他们自己。因此,符合该协议的类或结构应该在实现扣篮时为这些要求提供实现。
doesn't knows
协议被认为是DataSource协议,然后它总是包含所需的函数&#34;返回类型&#34;如下图所示。
how to do?
在自定义viewController中实现UITableView
protocol UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
}
此处,protocol UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
}
充当代理人(发件人)&amp; 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
&amp; tableView
被分配给delegate
,因为它具有相同的协议类型。
两个协议的非可选功能都在dataSource
类对象中实现,如下所示
self
函数viewController
UITableViewDelegate
函数func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// Do further processes like pushing or poping another viewController
}
1)当用户在某个部分中选择一行时,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")
}
通过将数据传递到参数tableview
和放大器来调用下面显示的UItableView()
func ; UITableViewDelegate
tableView
通过其indexPath
属性驻留在viewController
对象(接收方)中。现在delegate
使用那些传递的数据来执行进一步的处理,例如推送或弹出到新的自定义viewController。
viewController
2)tableView.delegate?.tableView(UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
协议内的函数向UITableViewDatasource
(发件人)提供自定义数据。 tableview
通过将数据传递给参数tableview
&amp;来调用数据源函数来询问viewController
对象。 tableView
indexPath
通过其viewController
属性驻留在datasource
对象(接收方)中。现在viewController
使用那些传递的数据&amp;返回自定义数据tableview
。现在tableview
使用这些数据来创建&#34; 10&#34;一节中的细胞和那种&#34;细胞&#34;在indexpath
tableView.dataSource?.tableView(UITableView, numberOfRowsInSection section: Int) -> returns "10"
tableView.dataSource?.tableView(UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> returns "cell"
最后,整个UIKit Framework
使用委托&amp;所有类中的数据源设计模式,例如UIApplication
,UITableView
,UICollectionView
,UITextField
&amp;等等来传达数据。不幸的是,UIKit Framework
不是开源的。
答案 2 :(得分:-3)
如果在任何情况下Bourne的答案都没有帮助..委托基本上是一个事件对一个对象的反应,并说“.delegate = self”意味着那些协议已被自我采用...例如..当tableview的委托方法“didSelectRowAtIndexPath”告诉我在tableview中选择一行时会发生什么...并且如果一个viewcontroller有一个tableview .. 并且“didSelectRowAtIndexPath”在该viewcontroller中定义,然后我们会说... tableview.delegate = self“... 而“self.anything”用来说“任何东西”都是自我的财产。 例如。 NSString *任何东西; @property(nonatomic,retain)NSString * anything;
然后“self.anything”