【问题标题】:How does iOS delegation actually work?iOS 委托实际上是如何工作的?
【发布时间】:2016-07-11 03:47:08
【问题描述】:

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

我的问题是为什么我的表会收到这个特定的委托回调?我的理解是委托只是一个没有实现的方法列表。在我看来,肯定还有很多事情要做。 “幕后”到底发生了什么?

如果我要将所有委托方法重命名为以下内​​容: - 神秘方法1 - 神秘方法2 -神秘方法3...等 其中一种方法负责在特定索引处设置行的高度。这些方法的另一种方法将负责编辑特定的行。

我读到的关于委托的所有内容都表明委托人与委托人签订了合同。委托承诺实现这些方法。当它发生时,不知何故,一切都正确连接,一切都神奇地工作。什么是我没有看到的魔法?

【问题讨论】:

  • 有数以千计的教程解释了委托的工作原理,其中一种随机解释可用,例如here.

标签: ios design-patterns delegates delegation


【解决方案1】:

我认为,为了了解委托的实际工作方式,您应该首先创建自己的自定义委托,这样您就会看到引擎盖下没有魔法,您可能看不到实际苹果构建的实现在委托方法中,但我向您保证,其中实现了很多逻辑,但出于隐私原因,我认为它不可用。 例如,当您创建自定义委托时...

你有 A 类,在这个类中,你首先创建一个协议

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

在这个类中,你有一个像这样的委托属性。

weak var delegate: ClassADelegate?

假设这个类是一个 Viewcontroller,并且你在它上面有一个 IBAction,就像一个 UIbutton,你的目标是当你点击那个按钮时,你的应用程序中的另一个 ViewController 将它的背景颜色更改为蓝色。在 A 类的这个动作中,你这样做......

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

, 假设“魔法”发生在 A 类中,顺便说一下,如果您在使用 UITableview 的委托中思考,则认为 UItableView 是 A 类。

好的,现在你有 B 类,你想改变颜色,对吧? 那么现在 B 类需要遵守这样的协议,就像你也遵守 UITableViewDelegate 等协议一样。

class ClassB: UIViewController, ClassADelegate {
}

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

let classa = ClassA()
classa.delegate = self

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 2011-09-27
    • 2021-12-16
    • 2013-03-14
    • 2021-03-23
    • 2011-02-11
    • 2017-07-31
    相关资源
    最近更新 更多