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
的方法将返回 YES
或 NO
,具体取决于您是否希望允许用户键入某些内容。
考虑到这一点,我会使用通知。你不关心更改UITextField
的内容的逻辑,你要做的就是每当内容改变时,改变你的视图标题。
如果需要限制内容,您可以允许任何delegate
仍然能够返回YES
或NO
,并且只有在代理返回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的主要内容,如果未能解决你的问题,请参考以下文章
在应用程序终止后使用 NSNotification 处理 UIViewController 中的 UILocalNotification