10

如果我想处理对 UITextField 的更改,例如用户在其中输入;似乎可以通过为该文本字段分配一个委托,然后让该委托实现 shouldChangeCharactersInRange,或者通过将目标添加到 textField 并处理 UIControlEventEditingChanged 事件来完成。

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

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

4

5 回答 5

9

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

您可以确定 textField in 的结果值shouldChangeCharactersInRange,但您必须使用提供的范围手动将 replacementString 应用于现有文本。(通过NSString stringByReplacingCharactersInRange)。如果您想知道生成的文本,使用UIControlEventEditingChanged.

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

如果您能坚持使用UIControlEvent-methods.

于 2011-02-25T04:21:22.840 回答
7

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

我还要说UITextField 委托协议只是作为 UIControl/UIEvent 的一种更方便、更高级别的替代方案来管理 UITextField 的行为。

最常见的委托模式是 UITableView DataSource 和 Delegate,我会说使用 UITextField 委托协议非常相似,因此看起来比直接处理来自 UIControl 的消息更明确的意图更直接。

于 2011-02-22T04:36:06.840 回答
6

我发现原始问题中提出的两种方法之间的一个关键区别是委托在更改值之前"shouldChangeCharactersInRange"被调用。在更改 中的值之后调用目标。UITextFieldUIControlEventEditingChangedUITextField

如果您使用这些事件来确保(例如)在启用“完成”按钮之前对话框中的所有字段都已完全填写,那么目标方法可能更适合您。它对我有用。

于 2012-06-03T22:29:37.400 回答
1

委托方式是同质化UITextFieldUITextView行为的方式。

UITextView没有控制事件。相比之下,UITextFieldDelegateUITextviewDelegate提供并行方法。

于 2011-11-01T11:08:18.987 回答
0

我发现插入和删除文本shouldChangeCharactersInRange的方法相同NSRange。您追加一个空格,然后将其删除,并且参数 fromshouldChangeCharactersInRange与重复的文本没有区别。

所以shouldChangeCharactersInRange实际上无法预测结果文本。

于 2011-11-15T21:30:02.290 回答