.delegate=self 是啥意思?

Posted

技术标签:

【中文标题】.delegate=self 是啥意思?【英文标题】:What is meant by .delegate=self?.delegate=self 是什么意思? 【发布时间】:2011-05-11 20:22:18 【问题描述】:

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

【问题讨论】:

【参考方案1】:

代表向您发送消息

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

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

如果您使用 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时会发生什么) 当然!你是一个“房子”。你做一个“房间”。房间从某物(比如“温度计”)获取代表信息。所以本质上,在“HOUSE”中,你会制作房间,然后你会说“将温度计委托给房间”。要么 !!!!!简单地说,在“ROOM”中,当它被初始化时,你可以说“set thermometer delegate to self”!完全一样,看!希望有帮助!! 多么美妙的解释——它让我想起了我曾经遇到过的最好的老师。如果您有时间,那么我有一个关于相关主题的新问题***.com/q/49246176/2348597 我欢迎您的回复。 等等等等代表什么?【参考方案2】:

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 的两个属性,即delegatedataSource 都分配给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 中的参数tableViewindexPath 调用下面所示的UITableViewDelegate 函数@object(Receiver) 通过其delegate 属性。现在viewController 使用这些传递的数据进行进一步的处理,例如推送或弹出到新的自定义视图控制器。

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

2) UITableViewDatasource 协议中的函数向tableview(Sender) 提供自定义数据。 tableview 通过调用 Datasource 函数将数据传递给参数 tableViewindexPath 来询问 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 在其所有类中使用委托和数据源设计模式,例如UIApplicationUITableViewUICollectionViewUITextField 等来传递数据。不幸的是,UIKit Framework 不是开源的。

【讨论】:

投反对票不仅仅是因为答案不正确。如果您将鼠标悬停在否决投票按钮上,您将看到一个工具提示。我建议回答较新的问题并且还没有答案。您可以收藏标签,它会过滤与您更相关的问题列表。这样您就可以找到要回答的新问题。【参考方案3】:

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

然后是“self.anything”

【讨论】:

以上是关于.delegate=self 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

在 self.delegate 实现 UIAlertViewDelegate 协议的 alertView 中设置 delegate:self.delegate

Delegate是啥,举例说明!

“self.delegate = self”不能在使用 ARC 的 iOS 上运行

WatchKit 中 UIApplication.sharedApplication().delegate 的等价物是啥?

为啥 UIDocumentMenu Delegate to self 不起作用?

使用 self.delegate 子类化 UITextField 会导致应用程序冻结,CPU 峰值达到 100%