代表与Cocoa Touch中的事件

aar*_*acy 5 iphone cocoa-touch objective-c uikit ios

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

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

为什么使用委托方法而不是事件?我也在视图控制器中注意到了这个viewDidLoad方法.为什么不直接使用活动?

bry*_*mac 6

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

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

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

代表很好能够将代码插入到其他一些对象处理的管道中,例如回调之前和之后,为控件提供数据源以及在视图之间进行通信:

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

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

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


Ter*_*cox 5

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

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

代理确实允许您在没有子类化的情况下更改行为.为了这个目的,他们充满了应该并且做了方法.如果要在操作之前和/或之后进行验证,通知或处理,请实现这些方法,而不是覆盖操作方法.

如果您发现自己认为需要子类化UIKit对象,请首先检查其委托方法.有机会放置您的自定义行为.