iOS委派如何实际工作?

时间:2016-07-11 03:47:08

标签: ios design-patterns delegates delegation

我理解如何使用已存在的iOS对象的委托。例如,如果我创建一个UITableView的实例,并且我的视图控制器符合UITableView委托,我可以实现UITableView委托的各种方法。我的新创建表可以接收通知,例如,调用didSelectRowAtIndexPath时。

我的问题是为什么我的表会得到这个特定的委托回调?我的理解是委托只是一个没有实现的方法列表。在我看来,必须有更多的事情发生。真实情况"在幕后"?

如果我要将所有委托方法重命名为以下内​​容,则为图像: - mysteryMethod1 - mysteryMethod2 - mysteryMethod3 ......等等 其中一种方法负责在特定索引处设置行的高度。另外一个方法将负责编辑特定行。

我读到的关于代表团的一切都说代理人与代表签订了合同。代表承诺实施这些方法。当它发生时,不知何故,所有东西都正确连接,一切都神奇地起作用。我没有看到的魔力是什么?

1 个答案:

答案 0 :(得分:0)

我认为,为了了解委托的实际工作原理,你应该首先创建自己的自定义委托,这样你就会发现底层没有魔法,你可能看不到实际的apple build的实现在委托方法中,但我向你保证,在这些方法中实现了很多逻辑,但我认为这是出于隐私原因而无法实现的。 当你创建自定义委托时,比如说......

您有A类,在本课程中,您首先要创建一个协议

protocol ClassADelegate: class {
func changeBackgroundColor(_ color: UIColor?)
}

在这个课程中你有一个像这样的委托属性。

weak var delegate: ClassADelegate?

假设这个类是一个Viewcontroller,你有一个像UI按钮一样的IBAC,你的目标是当你点击该按钮时,你的应用程序中的另一个ViewController将其背景颜色更改为蓝色。在A级的这个动作中,你可以这样做......

func someAction() {
 delegate?.changeBackgroundColor(.blue)
}

, 假设在A类中发生“魔术”,顺便说一句,如果你在使用UITableview的代表中思考,那么认为UItableView是A类。

好的,现在你有B级,你想要改变颜色吗? 那么现在B类需要符合这样的协议,就像你也符合协议UITableViewDelegate等。

class ClassB: UIViewController, ClassADelegate {
}

现在想一下委托这个词,并想一想这意味着什么,你只是将责任委托给其他人,对吧?是的,在这种情况下,ClassB将成为委托,因为我们需要在B类中拥有一个A类实例才能访问它的委托属性。

let classa = ClassA()
classa.delegate = self

最后一步就是像这样调用协议的方法..

func changeBackgroundColor(_ color: UIColor?) {
view.backgroundColor = color
}

如果你在课堂上看到这个方法但是你无法访问协议的实现,那么你会问自己“这种神奇的颜色来自哪里?”但正如你所看到的那样,它只来自协议所属的另一个类,希望这会有所帮助。