UITextFieldDelegate与UITextField控件事件
如果我想处理对UITextField的更改,例如用户输入它; 看起来这可以通过将委托分配给该文本字段,然后让委托实现shouldChangeCharactersInRange,或者通过向textField添加目标,以及处理UIControlEventEditingChanged事件来完成。
除了使用委托方法,您可以返回NO并因此阻止用户进行编辑,这两件事之间有什么区别吗?
处理编辑开始或编辑结束的问题相同。 可以使用适当的委托方法或适当的事件来完成。 如果控件事件可以执行必要的工作,那么textField委托实际上是什么?
你是对的; 你可以基本上通过两者做同样的事情,但是UIControl是较低级别的,并且允许你通过[UIControl addTarget:action:forControlEvents:]
将每个特定的UIEvent吸引到不同的目标,其中只有一个委托。
我还要说UITextField委托协议只是作为一种管理UITextField行为的方式,作为UIControl / UIEvent的一种更方便,更高级别的替代方案。
最常见的委托模式是UITableView DataSource和Delegate,我想说使用UITextField委托协议是非常相似的,因此看起来比直接从UIControl处理消息更明确的意图更直接。
在更改发生之前调用shouldChangeCharactersInRange
,并为您提供“取消”更改的机会。 发生更改后调用UIControlEventEditingChanged
。
您可以在shouldChangeCharactersInRange
确定textField的结果值,但必须使用提供的范围手动将replacementString应用于现有文本。 (通过NSString stringByReplacingCharactersInRange
)。 如果您想知道生成的文本,使用UIControlEventEditingChanged
更容易,更有效。
shouldChangeCharactersInRange
通常用于实现输入的validation检查 – 也就是说,您可以在输入时过滤字符/粘贴文本。 例如,如果字段用于电话号码,则可以在用户键入非数字字符时返回FALSE
,或者尝试粘贴非数字的文本。
如果您可以坚持使用UIControlEvent-methods.
您可能会发现可以重用多个控件的代码的情况UIControlEvent-methods.
我在原始问题中提出的两种方法之间找到的一个关键区别是,在UITextField
的值发生更改之前 ,将调用委托"shouldChangeCharactersInRange"
。 在UITextField
的值发生更改后 ,将调用UIControlEventEditingChanged
的目标。
如果您正在使用这些事件来确保(例如)在启用“完成”按钮之前完全填充对话框中的所有字段,则目标方法可能更适合您。 它对我有用。
委托方法是使UITextField
和UITextView
行为同质化的方法。
UITextView
没有控件事件。 相比之下, UITextFieldDelegate
和UITextviewDelegate
提供了并行方法。
我发现shouldChangeCharactersInRange
传递相同的NSRange
以插入和删除文本。 您附加一个空格然后将其删除,并且shouldChangeCharactersInRange
中的参数与文本的重复无法区分。
所以shouldChangeCharactersInRange
实际上无法预测生成的文本。