iPhone开发 - 代表或活动?

时间:2009-08-04 19:36:43

标签: iphone objective-c events delegates

在许多情况下,例如在用户点击完成后使键盘消失,有两个选项:将文本字段的委托设置为self,并采用UITextFieldDelegate协议,然后使用方法

- (BOOL)textFieldShouldReturn:(UITextField *)textField; 

resignFirstResponder并返回YES。但你也可以

      addTarget:self 
         action:@selector(myMethod:) 
forControlEvent:UIControlEventDidEndOnExit]; 

或类似的东西,在退出事件上使用did end,然后在方法[sender resignFirstResponder]中使用。那么在这样的情况下最好的选择是什么:委托还是事件?

3 个答案:

答案 0 :(得分:1)

快速的经验法则是代表们应该回答“我应该吗?”的问题。代表他们是代表的对象。另一方面,事件随后播出,让听众知道发生了什么事。

在你的情况下,虽然你可以调用[sender resignFirstResponder]来响应这个事件,你可以通过这样做来混淆隐喻。您的代表应该已经决定隐藏键盘(或不是),广播的事件只是让所有其他组件知道他们键盘隐藏。

答案 1 :(得分:0)

委托使您的对象更具可重用性,它们是一个适配器,允许任何对象与该对象的已定义行为进行交互并使用该对象。我想说,委托应该由负责保持其正在使用的对象中将发生的操作的状态和定义行为的对象采用。事件应该用于任何其他对象,这些对象特定于具有协议的对象所执行的操作(因此对象不负责保持定义协议的对象的状态)。

例如:使用文本字段的视图控制器将采用其协议来消除键盘以及文本字段可能发生的任何其他行为,也许另一个控制器将在键盘被解除时执行一些动画,因此它将注册到textfield作为事件,以便接收键盘被解除的事件。

答案 2 :(得分:0)

如果你要与另一个类配对,那个类的真实类型可能会有所不同,那么将这种配对形式化为协议和委托安排是很有意义的。

如果您要发送的信息针对的是更广泛的对象集,那么使用通知会更有意义 - 尽管现在您已经有点模糊了通知传递的信息,因为没有集中的定义期待什么。

两者都是一个相同的负载 - 与代表你必须自己设置,然后记得在你被解除分配之前取消自己。你必须对通知做同样的事情,记得在你被解除分配之前开始收听然后取消订阅。

此外,您应该尽可能多地尝试确保在主线程上发送通知,因为通知会在它们开始的同一个线程上发送。委托方法也是如此,从其他神秘线程中调用委托方法并不是很好!