UITextFieldDelegate vs UITextField控件事件

问题描述:

如果我想处理对UITextField的更改,例如用户输入它;似乎可以通过为该文本字段分配一个委托,然后让该委托实现shouldChangeCharactersInRange,或者通过向textField添加一个目标以及处理UIControlEventEditingChanged事件来完成此操作。UITextFieldDelegate vs UITextField控件事件

除了使用委托方法,您可以返回NO并因此阻止用户进行编辑,这两件事之间是否有区别?

用于处理编辑开始或编辑结束的相同问题。它可以通过适当的委托方法或适当的事件来完成。如果控件事件可以完成必要的工作,那么textField委托实际上是什么?

你是对的;你基本上可以通过两者做同样的事情,但是UIControl是低级的,并且可以通过[UIControl addTarget:action:forControlEvents:]来吸引每个特定的UIEvent到不同的目标,因为只有一个委托。

我也会说UITextField delegate protocol只是作为管理UITextField行为的一种方式,作为更方便,更高级的UIControl/UIEvent替代方案。

最常见的代表模式是UITableView DataSource和Delegate,我会说使用UITextField委托协议非常相似,因此看起来更直接,而且定义的意图远比直接从UIControl处理消息更直接。

shouldChangeCharactersInRange在更改发生之前调用,并为您提供“取消”更改的机会。发生更改后调用UIControlEventEditingChanged

您可以在shouldChangeCharactersInRange中确定textField的结果值,但必须使用提供的范围手动将replacementString应用于现有文本。 (通过NSString stringByReplacingCharactersInRange)。如果你想知道结果文本,使用UIControlEventEditingChanged更容易,更高效。

shouldChangeCharactersInRange通常用于实现对输入的验证检查 - 也就是说,您可以在输入字符/粘贴文本时对其进行过滤。例如,如果某个字段用于电话号码,则如果用户键入非数字字符或尝试粘贴非数字文本,则可以返回FALSE

您可能会发现在这里你可以为多个控件重用代码的情况下,如果你可以用UIControlEvent-methods.

代表团办法坚持是均质UITextFieldUITextView行为的方式。

UITextView没有控制事件。相反,UITextFieldDelegateUITextviewDelegate提供了并行方法。

我发现shouldChangeCharactersInRange通过相同的NSRange来插入和删除文本。您追加一个空格然后将其删除,shouldChangeCharactersInRange中的参数与文本的重复无法区分。因此shouldChangeCharactersInRange实际上不能预测结果文本。我在原来的问题提出的两种方法之间找到

一个关键的区别是,委托"shouldChangeCharactersInRange"被调用UITextField的值更改。 UIControlEventEditingChanged的目标被称为AFTERUITextField中的值发生更改。

如果您正在使用这些事件来确保(例如)在启用“完成”按钮之前完全填充了对话框中的所有字段,则目标方法可能对您更好。它为我做了。