NSNotification 与 UITextFieldDelegate

Posted

技术标签:

【中文标题】NSNotification 与 UITextFieldDelegate【英文标题】:NSNotification vs UITextFieldDelegate 【发布时间】:2014-04-08 13:13:42 【问题描述】:

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

我们必须在编辑过程中处理 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 是一种好习惯吗?”

更新2:

感谢所有回答问题的人!

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

有兴趣了解人们的投票在哪里下降以及人们提出的其他利弊。 感谢您的回答。我已更新问题以使其更清楚。 @Avt 出于我给出的原因,我仍然认为委托是可行的方法,即使您只使用委托协议的一小部分,并且只是返回您通过传递获得的任何布尔结果对 super 的调用。【参考方案2】:

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

考虑到应用程序工作流程不会有任何进一步的变化。这几乎相等。但我还是更喜欢使用委托,原因如下:

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

【讨论】:

【参考方案3】:

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

考虑到这一点,我会使用通知。你不关心更改UITextField的内容的逻辑,你要做的就是每当内容改变时,改变你的视图标题。

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

编辑

如果我误解了问题,请处理 UITextFieldDelegate 方法中的文本并使用通知来更新视图的标题。除非 UITextFieldDelegate 是视图,在这种情况下,我将直接从 UITextFieldDelegate 方法更新视图的标题。

编辑#2

根据您的进一步编辑和要求,我将使用委托方法。 NSNotification 带有代表没有的问题 - 调试和性能(如 RobP 提到的)就是其中之一。另一个是在你对它所附加的任何东西进行释放后留下一个NSNotification 会更容易,从而导致崩溃(好看的调试,请参阅 RobP 的答案)。

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

【讨论】:

感谢您的回答。我已更新问题以使其更清楚。【参考方案4】:

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

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

【讨论】:

以上是关于NSNotification 与 UITextFieldDelegate的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发如何限制NSNotification的作用范围

iOS开发如何限制NSNotification的作用范围

iOS开发如何限制NSNotification的作用范围

iOS开发如何限制NSNotification的作用范围

这里是指推送通知跟NSNotification有区别:

在应用程序终止后使用 NSNotification 处理 UIViewController 中的 UILocalNotification