NSNotification与UITextFieldDelegate

时间:2014-04-08 13:13:43

标签: ios objective-c cocoa-touch uitextfield nsnotifications

我的同事和我更喜欢不同的方法来解决一项小任务。我们想知道社区的意见。

我们必须在编辑过程中处理UITextField的文本。 (文本应显示在视图的标题中)

两种最简单的方法是:

1.注册通知:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(textFieldDidChangeNotification:)
                                             name:UITextFieldTextDidChangeNotification
                                           object:_titleTextField];

2.使用UITextFieldDelegate方法

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSMutableString *mutableString = [textField.text mutableCopy];
    [mutableString replaceCharactersInRange:range withString:string];

    // use mutableString for father processing

    return YES;
}

哪种方法更好,为什么?在这种情况下,有什么理由可以避免采取某种方法吗?

更新:(一些澄清)

我们不需要委托提供任何额外的灵活性(如禁止某些编辑的可能性)或通知(可能添加几个观察者)。我们的主要问题是“如果我们可以轻松解决委托问题,那么使用NSNotifications是一种好的做法吗?”

UPDATE2:

感谢所有回答问题的人!

社区对问题的回答似乎“如果我们可以轻松解决委托问题,那么使用NSNotifications是一种好习惯吗?”是是的。但是对于我们的原始问题,我们发现了另一个(第三个)变体,它比代表和NSNotification更好(见接受的答案)。

4 个答案:

答案 0 :(得分:1)

UITextFieldDelegate的方法将返回YESNO,具体取决于您是否希望允许用户键入某些内容。

考虑到这一点,我会使用通知。您不必关心更改UITextField内容的逻辑,您只需要更改内容,就可以更改视图的标题。

如果需要限制内容,则允许任何delegate仍然能够返回YESNO,并且只有代表才会发送通知已返回YES(或者如果没有代表)。

修改

如果我误解了问题,请处理UITextFieldDelegate方法中的文字并使用通知更新视图标题。除非UITextFieldDelegate是视图,否则我只是直接从UITextFieldDelegate方法更新视图标题。

编辑#2

根据您的进一步编辑和要求,我将提交使用委托方法。 NSNotification附带了委托代理的问题 - 调试和性能(正如RobP所提到的)就是其中之一。另一个问题是,在你解除附加的任何内容之后,让NSNotification徘徊更容易,导致崩溃(好看的调试,请参阅RobP的回答) 。

在您的具体情况下,委托获胜。

答案 1 :(得分:1)

我已经编写了很多这两个,我不同意亚当。通知证明在大多数情况下调试和追溯更加困难。我还怀疑他们会增加更多的性能开销,但这对我来说是轶事,而我还没有对它进行基准测试。 当可能有多个观察者需要对事件采取行动时,和/或当我想要"松耦合时,我倾向于通知。代码的一部分不应该在另一部分中具有API的特定知识。 在您的情况下,文本字段已经带有一个逻辑,以获得委托并在某些事件上调用委托,因此这是一个明智的选择。如果在您需要时使用所需数据调用一个或多个委托方法。这是更简单,更合适的途径。

答案 2 :(得分:1)

委托和通知之间的主要区别在于通知将通知所有类,以防他们订阅它。代表是一对一的。

考虑到申请工作流程不会有任何进一步的变化。这几乎是相同的。但我仍然喜欢使用委托,原因如下:

  • 这是更常见的方法,因此它将使您的代码更具可读性和可维护性;
  • 使用通知你必须订阅它,所以这是额外的行。不是很多,但ViewControllers通常是ios应用程序中最大的类。
  • 通知在委托使用SHOLUD时使用事件DID,因此如果您需要阻止文本字段输入smth应该更适合

答案 3 :(得分:0)

由于UITextField继承自UIControl,我们也可以使用addTarget: action: forControlEvents:

[_textField addTarget:self action:@selector(textDidChange) forControlEvents:UIControlEventEditingChanged];