【问题标题】:Delegates vs. events in Cocoa TouchCocoa Touch 中的代表与事件
【发布时间】:2012-01-05 23:21:33
【问题描述】:

我正在编写我的第一个 iPhone 应用程序,并且一直在探索 Cocoa Touch 和 Objective-C 中的设计模式。我来自客户端 Web 开发的背景,所以我试图将我的头脑围绕在代表身上。

具体来说,我不明白为什么需要委托对象而不是事件处理程序。例如,当用户按下一个按钮时,它会通过一个事件 (UITouchUpInside) 进行处理,但是当用户完成对文本框的输入并使用“完成”按钮将其关闭时,该操作会通过调用一个方法来处理在文本框的委托 (textFieldShouldReturn) 上。

为什么使用委托方法而不是事件?我还在视图控制器中使用viewDidLoad 方法注意到了这一点。为什么不只使用事件?

【问题讨论】:

    标签: iphone objective-c ios cocoa-touch uikit


    【解决方案1】:

    编辑:另一个好帖子: NSNotificationCenter vs delegation( using protocols )?

    委托是一个回调,因此存在 1:1 的关系。委托是实现正式协议的对象的单个实例。

    通知(事件)基本上是在发生某事时向许多感兴趣的对象广播。

    委托有利于将代码插入到其他一些对象处理的管道中,例如回调之前和之后,为控件提供数据源并在视图之间进行通信:

    What exactly does delegate do in xcode ios project?

    因此,委托与对象的关系更加紧密,因为它们是唯一提供的对象,可以插入和更改对象的处理或提供数据。您正在推迟决策和外部操作,例如将数据加载到其他对象 - 这就是为什么它是通用 UIKit 类的一种非常常见的模式。通知其他对象是一种更松散的关系——它只是通知其他人发生了某事。

    这也不一定是“vs”问题。例如,您可能有一个应用程序进行后台处理,它触发了一些更改通知,导致视图调用其数据源委托以刷新其视图。它们是两种不同的机制。

    【讨论】:

      【解决方案2】:

      事件和委托有两个不同的用途,所以你会看到两者都被使用了。

      如果您只想按下按钮来触发消息,则可以使用事件。如果您希望您的 Done 按钮按下以在允许失去焦点之前验证文本字段的上下文,您可以使用 textFieldShouldReturn 委托方法来处理任何验证,如果没有则返回 NO t 验证。

      委托确实允许您更改行为而无需子类化。为此,它们充满了 shoulddid 方法。当您想要在操作之前和/或之后验证、通知或处理时,您可以实现这些方法,而不是覆盖操作方法。

      如果您发现自己认为需要子类化 UIKit 对象,请先检查其委托方法。很有可能已经有一个地方可以放置您的自定义行为。

      【讨论】:

        【解决方案3】:

        一个明显的区别是委托方法可以有返回值,因为存在一对一的关系。另一方面,事件与发送类松散耦合,通常不关心是否有任何响应。

        其他委托方法只是为了方便而存在,并且可以有相应的事件也被触发。

        【讨论】:

          猜你喜欢
          • 2012-02-07
          • 1970-01-01
          • 2011-01-18
          • 1970-01-01
          • 2014-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多