【问题标题】: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 被调用。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-02-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多