我的同事和我更喜欢不同的方法来解决一项小任务。我们想知道社区的意见。
我们必须在编辑过程中处理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更好(见接受的答案)。
答案 0 :(得分:1)
UITextFieldDelegate
的方法将返回YES
或NO
,具体取决于您是否希望允许用户键入某些内容。
考虑到这一点,我会使用通知。您不必关心更改UITextField
内容的逻辑,您只需要更改内容,就可以更改视图的标题。
如果需要限制内容,则允许任何delegate
仍然能够返回YES
或NO
,并且只有代表才会发送通知已返回YES
(或者如果没有代表)。
修改强>
如果我误解了问题,请处理UITextFieldDelegate
方法中的文字并使用通知更新视图标题。除非UITextFieldDelegate
是视图,否则我只是直接从UITextFieldDelegate
方法更新视图标题。
编辑#2
根据您的进一步编辑和要求,我将提交使用委托方法。 NSNotification
附带了委托代理的问题 - 调试和性能(正如RobP所提到的)就是其中之一。另一个问题是,在你解除附加的任何内容之后,让NSNotification
徘徊更容易,导致崩溃(好看的调试,请参阅RobP的回答) 。
在您的具体情况下,委托获胜。
答案 1 :(得分:1)
我已经编写了很多这两个,我不同意亚当。通知证明在大多数情况下调试和追溯更加困难。我还怀疑他们会增加更多的性能开销,但这对我来说是轶事,而我还没有对它进行基准测试。 当可能有多个观察者需要对事件采取行动时,和/或当我想要"松耦合时,我倾向于通知。代码的一部分不应该在另一部分中具有API的特定知识。 在您的情况下,文本字段已经带有一个逻辑,以获得委托并在某些事件上调用委托,因此这是一个明智的选择。如果在您需要时使用所需数据调用一个或多个委托方法。这是更简单,更合适的途径。
答案 2 :(得分:1)
委托和通知之间的主要区别在于通知将通知所有类,以防他们订阅它。代表是一对一的。
考虑到申请工作流程不会有任何进一步的变化。这几乎是相同的。但我仍然喜欢使用委托,原因如下:
答案 3 :(得分:0)
由于UITextField继承自UIControl,我们也可以使用addTarget: action: forControlEvents:
[_textField addTarget:self action:@selector(textDidChange) forControlEvents:UIControlEventEditingChanged];