“.delegate=self” 是什么意思?

48

请问有谁能解释一下 someViewController.delegate = selfself.delegate 的含义?它们对我们有什么帮助?

3个回答

104
委托将消息发送给您。 例如:如果您使用加速度计委托,则会收到有关加速度计的消息。 如果您使用新的中微子检测委托,您将收到有关区域内任何中微子被检测到的消息。 如果您使用弹出窗口,则弹出窗口会向您发送消息。这是通过弹出窗口的委托完成的。有许多,许多例子。 所以,委托发送消息。 就是这么简单。 您可能会问,“它将消息发送到哪里?”答案是:它将消息发送到您设置的“.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。而 'Flying' 只想使用一个代理 - 它想要使用加速度计。
在 Swift 中...
 class YourClass:UIViewController, SomeDelegate, AnotherDelegate

在iPhone上,如果不到处使用代理(delegates),你几乎无法做任何事情。

iOS中的所有地方都在使用代理。

一个类可能会使用十几个代理是很正常的。也就是说,你的类需要从十几个代理那里获取信息。

现在使用Swift很简单,只需键入:

  blah.delegate = self

就是这样了。

所以这就是你所做的。委托发送消息。你必须说出要将消息发送到哪里。通常,你希望它们发送给“你自己”,因此在这种情况下,你只需说blah.delegate=self


11
顺便提一下,实际上并没有中微子检测代表团,你需要自己编写。 - Fattie
5
好的回答。你能否举一个例子,说明什么情况下设置委托为其他内容是必要的(以及它意味着什么)?换句话说,当你不使用self时会发生什么? - Benny
4
好的!你是一个“房子”,你制造一个“房间”。这个房间从某个东西(比如说一个“温度计”)获取委托信息。因此,在“房子”中,你会制造这个房间,然后你会说:“将温度计委托设置为房间”。或者!!!简单来说,在“房间”初始化时,你可以说:“将温度计委托设置为自身”!这完全相同,明白了吗!希望有所帮助! - Fattie
3
真是一份精彩的解释——它让我想起了我最喜欢的老师。如果你有时间,我有一个关于相关话题的新问题 https://stackoverflow.com/q/49246176/2348597 我很期待你的回复。 - Greg
1
"而blah代表什么意思?" - uuuuuu
@uuuuuu 唤醒了一个旧的线程,但是为了回答你的问题,在一个示例中,blah 是一些数据管理器的对象。假设你有一个 WeatherManager 结构体来处理 URL 请求和解析 JSON 数据。你必须在你的 UIViewController 类中声明 weather = WeatherManager(),该类还实现了协议 WeatherManagerDelegate 中声明的方法(按照惯例将这些方法放在与对应数据相对应的结构体所在的同一文件中,即 WeatherManager)。因此,blah 变成了 weather,因此 weather.delegate = self - Eduardo Perez

-2

Delegate 用于在两个类对象之间传递/通信数据/消息。在这里,tableView(发送方)向 viewController(接收方)发送数据/消息。 考虑在自定义的 viewController 中实现 UITableView 的示例 在这里,UITableViewDataSourceUITableViewDelegate 实际上是协议。不幸的是,UIKit Framework 不是开源的。但是我可以保证,在参考了许多文章后,这就是内部发生的事情。

协议就像篮球教练,其中包含一些要求。他/她通过使用这些要求告诉类、结构体、枚举等玩家“做什么?”但是他/她本身并不知道“如何做?”因此,符合该协议的类或结构体应提供对这些要求的实现,同时实现扣篮的目标。

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 
}

在自定义视图控制器中实现UITableView

class viewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    let tableView = UITableView()    

    override func viewDidLoad {
      tableView.delegate = self
      tableView.dataSource = self
    }

在这里,tableView 充当委托者(发送方),而 viewController 对象即 (self) 充当代理者(接收方)。

为了在 viewController 中获取 UITableView。它应该符合两个协议。

因此,viewController 类对象已经实现了这两个协议所需的所有必要函数。现在,self 可以被用作 UITableViewDelegate 类型或 UITableViewDataSource 类型,因为协议可以用作类的对象类型,该类符合该协议。 现在,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(发送方),即UItableView()通过其delegate属性调用下面所示的UITableViewDelegate函数,并将数据传递给viewController对象(接收方)中的tableViewindexPath参数。现在,viewController使用这些传递的数据进行进一步的处理,例如推送或弹出到新的自定义视图控制器。

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

2) UITableViewDatasource协议中的函数提供自定义数据给tableview(发送方)。通过调用带有传递数据到参数tableViewindexPath的Datasource函数,tableviewviewController对象(接收方)询问。这些参数位于viewController对象的datasource属性中。现在,viewController使用传递的数据并返回自定义数据给tableview。现在,tableview使用这些数据在一个部分中创建"10"个单元格,并在indexpath上创建一种"cell"

tableView.dataSource?.tableView(UITableView, numberOfRowsInSection section: Int) -> returns "10"

tableView.dataSource?.tableView(UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> returns "cell"

最后,整个UIKit Framework在其所有类中都使用委托和数据源设计模式,例如UIApplicationUITableViewUICollectionViewUITextField等等,以便进行数据通信。不幸的是,UIKit Framework不是开源的。


2
下投票不仅仅是针对回答错误的情况。如果你将鼠标悬停在下投票按钮上,你会看到一个工具提示。我建议回答那些更近期且没有答案的问题。你可以收藏标签,这样它会过滤掉与你相关性较低的问题列表。这样你就可以找到更新的问题来回答了。 - Fogmeister

-3

如果 Bourne 的回答在任何情况下都没有帮助... 代理基本上是对象事件的反应,而 ".delegate=self" 表示这些协议已经在 self 中被采用了... 例如... 当在 tableview 中选择一行时会发生什么由 tableview 的代理方法 "didSelectRowAtIndexPath" 告诉我们... 如果一个视图控制器有一个 tableview... 并且 "didSelectRowAtIndexPath" 只在该视图控制器中定义,那么我们就会说... tableview.delegate = self"... 而 "self.anything" 用于表示 "anything" 是 self 的属性... 例如。 NSString* anything; @property(nonatomic,retain) NSString* anything;

那么就是 "self.anything"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接