.delegate=self 是啥意思?
Posted
技术标签:
【中文标题】.delegate=self 是啥意思?【英文标题】:What is meant by .delegate=self?.delegate=self 是什么意思? 【发布时间】:2011-05-11 20:22:18 【问题描述】:谁能解释someViewController.delegate = self
和self.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 knows
how 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
不是开源的。
【讨论】:
投反对票不仅仅是因为答案不正确。如果您将鼠标悬停在否决投票按钮上,您将看到一个工具提示。我建议回答较新的问题并且还没有答案。您可以收藏标签,它会过滤与您更相关的问题列表。这样您就可以找到要回答的新问题。【参考方案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
“self.delegate = self”不能在使用 ARC 的 iOS 上运行
WatchKit 中 UIApplication.sharedApplication().delegate 的等价物是啥?