如果我想处理对UITextField的更改,例如用户输入它;看起来这可以通过为该文本字段分配委托,然后让委托实现shouldChangeCharactersInRange,或者通过向textField添加目标,以及处理UIControlEventEditingChanged事件来完成 .
除了使用委托方法,您可以返回NO并因此阻止用户进行编辑,这两件事之间有什么区别吗?
处理编辑开始或编辑结束的问题相同 . 可以使用适当的委托方法或适当的事件来完成 . 如果控件事件可以执行必要的工作,那么textField委托实际上是什么?
5 回答
你是对的;你可以基本上通过两者做同样的事情,但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.
,您可以重复使用多个控件的代码我在原始问题中提出的两种方法之间发现的一个关键区别是委托
"shouldChangeCharactersInRange"
被 BEFORE 中的值变为UITextField
.UIControlEventEditingChanged
的目标被称为UITextField
UITextField
中的值更改 .如果您正在使用这些事件来确保(例如)在启用“完成”按钮之前完全填充对话框中的所有字段,则目标方法可能更适合您 . 它对我有用 .
授权方法是使行为同质化的方式 .
UITextView
没有控制事件 . 相比之下,UITextFieldDelegate
和UITextviewDelegate
提供了并行方法 .我发现
shouldChangeCharactersInRange
传递相同的NSRange
用于插入和删除文本 . 您附加一个空格然后将其删除,shouldChangeCharactersInRange
中的参数与文本的重复无法区分 .所以
shouldChangeCharactersInRange
实际上无法预测得到的文本 .