.delegate = self是什么意思?

时间:2010-11-18 05:27:34

标签: objective-c cocoa delegates protocols delegation

有人能解释someViewController.delegate = selfself.delegate的含义吗?他们在哪里帮助我们?

3 个答案:

答案 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;所有类中的数据源设计模式,例如UIApplicationUITableViewUICollectionViewUITextField&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”