【问题标题】:UITextFieldDelegate vs UITextField control eventsUITextFieldDelegate vs UITextField 控件事件
【发布时间】:2011-06-22 21:02:33
【问题描述】:
如果我想处理对 UITextField 的更改,例如用户在其中输入;似乎可以通过为该文本字段分配一个委托,然后让该委托实现 shouldChangeCharactersInRange,或者通过向文本字段添加一个目标并处理 UIControlEventEditingChanged 事件来完成。
除了使用委托方法,您可以返回 NO 并因此阻止用户进行编辑,这两件事之间有什么区别吗?
处理编辑开始或编辑结束的相同问题。它可以通过适当的委托方法或适当的事件来完成。如果控制事件可以完成必要的工作,那么 textField 委托实际上是做什么用的?
【问题讨论】:
标签:
ios
uitextfield
uicontrol
uitextfielddelegate
【解决方案1】:
你是对的;您基本上可以通过两者执行相同的操作,但 UIControl 级别较低,您可以通过 [UIControl addTarget:action:forControlEvents:] 将每个特定的 UIEvent 虹吸到不同的目标,因为只有一个委托。
我还要说UITextField delegate protocol 只是作为 UIControl/UIEvent 的一种更方便、更高级别的替代方案来管理 UITextField 的行为。
最常见的委托模式是 UITableView DataSource 和 Delegate,我会说使用 UITextField 委托协议非常相似,因此看起来比直接处理来自 UIControl 的消息更明确的意图。
【解决方案2】:
shouldChangeCharactersInRange 在更改发生之前被调用,并为您提供“取消”更改的机会。更改发生后调用UIControlEventEditingChanged。
您可以确定shouldChangeCharactersInRange 中textField 的结果值,但您必须使用提供的范围手动将replacementString 应用于现有文本。 (通过NSString stringByReplacingCharactersInRange)。如果您想知道生成的文本,使用UIControlEventEditingChanged 会更简单、更高效。
shouldChangeCharactersInRange 通常用于实现输入的验证检查——也就是说,您可以在输入时过滤字符/粘贴的文本。例如,如果字段用于电话号码,如果用户键入非数字字符或尝试粘贴非数字文本,您可以返回 FALSE。
如果您坚持使用UIControlEvent-methods.,您可能会发现可以为多个控件重用代码的情况
【解决方案3】:
委托方法是同质化UITextField 和UITextView 行为的方法。
UITextView 没有控制事件。相比之下,UITextFieldDelegate 和 UITextviewDelegate 提供并行方法。
【解决方案4】:
我发现shouldChangeCharactersInRange 通过相同的NSRange 插入和删除文本。你追加一个空格,然后删除它,shouldChangeCharactersInRange 的参数与文本的重复没有区别。
所以shouldChangeCharactersInRange 实际上无法预测结果文本。
【解决方案5】:
我发现原始问题中提出的两种方法之间的一个关键区别是委托"shouldChangeCharactersInRange" 被调用在UITextField 中的值更改之前。 UIControlEventEditingChanged 的目标在UITextField 更改中的值AFTER 被调用。
如果您使用这些事件来确保(例如)在启用“完成”按钮之前对话框中的所有字段都已完全填写,那么目标方法可能更适合您。它对我有用。