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的目标。

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

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

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

我发现shouldChangeCharactersInRange传递相同的NSRange以插入和删除文本。 您附加一个空格然后将其删除,并且shouldChangeCharactersInRange中的参数与文本的重复无法区分。

所以shouldChangeCharactersInRange实际上无法预测生成的文本。