代表与cocoa触摸事件

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

具体来说,我不明白为什么委托对象需要而不是事件处理程序。 例如,当用户按下一个button时,它将被一个事件( UITouchUpInside )处理,但是当用户input完一个文本框并用“完成”buttonclosures它时,通过调用文本框的代表( textFieldShouldReturn )。

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

编辑:另一个好post: NSNotificationCenter vs委托(使用协议)?

委托是一个callback,所以有1:1的关系。 委托是实现正式协议的对象的单个实例。

通知(事件)基本上广播给许多当发生事情时感兴趣的对象。

代表能够将代码插入到其他对象处理的pipe道中,例如callback之前和之后,为视图之间的控制和通信提供数据源:

委托在xcode ios项目中究竟做了些什么?

因此委托人与对象之间的关系要紧密得多,因为他们是单个提供的对象来插入和改变对象的处理或提供数据。 你正在推迟决定和外部操作,如加载数据到其他对象 – 这就是为什么它是一个普通的UIKit类的常见模式。 对其他物体的通知是一个更松散的关系 – 只是一个通知别人发生了什么事情。

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

事件和代表有两个不同的目的,所以你会看到两个使用。

如果你只是想按你的button来触发一个消息,一个事件是好的。 如果您希望您的“完成”button在允许失去焦点之前按下以validation文本字段的上下文,则可以使用textFieldShouldReturn委托方法来处理任何validation,如果validation无效,则返回“否”。

代表真的可以让你改变行为而不需要inheritance。 为了这个目的,他们充满了应该 做的方法。 当您要在动作之前和/或之后validation,通知或处理时,您可以实现这些方法,而不是重写操作方法。

如果您发现自己以为您需要inheritance一个UIKit对象,请首先检查其委托方法。 有机会已经有一个地方来把你的自定义行为。

一个明显的区别是委托方法可以有返回值,因为存在一对一的关系。 另一方面,事件松散地与派遣阶级联系在一起,派遣阶级通常不关心有没有反应。

其他委托方法仅仅是为了方便,可以有相应的事件也被触发。