首页 文章

UITextFieldDelegate与UITextField控件事件

提问于
浏览
9

如果我想处理对UITextField的更改,例如用户输入它;看起来这可以通过为该文本字段分配委托,然后让委托实现shouldChangeCharactersInRange,或者通过向textField添加目标,以及处理UIControlEventEditingChanged事件来完成 .

除了使用委托方法,您可以返回NO并因此阻止用户进行编辑,这两件事之间有什么区别吗?

处理编辑开始或编辑结束的问题相同 . 可以使用适当的委托方法或适当的事件来完成 . 如果控件事件可以执行必要的工作,那么textField委托实际上是什么?

5 回答

  • 9

    你是对的;你可以基本上通过两者做同样的事情,但UIControl是较低级别,并允许你通过 [UIControl addTarget:action:forControlEvents:] 将每个特定的UIEvent吸引到不同的目标,因为只有一个委托 .

    我还要说UITextField delegate protocol只是作为一种管理UITextField行为的方式,作为UIControl / UIEvent的一种更方便,更高级别的替代方案 .

    最常见的委托模式是UITableView DataSource和Delegate,我会说使用UITextField委托协议是非常相似的,因此看起来比直接从UIControl处理消息更明确的意图更直接 .

  • 0

    在更改发生之前调用 shouldChangeCharactersInRange ,并为您提供更改的机会 . 发生更改后调用 UIControlEventEditingChanged .

    您可以在 shouldChangeCharactersInRange 中确定textField的结果值,但必须使用提供的范围手动将replacementString应用于现有文本 . (通过 NSString stringByReplacingCharactersInRange ) . 如果您想知道生成的文本,使用 UIControlEventEditingChanged 会更容易,更有效 .

    shouldChangeCharactersInRange 通常用于实现输入的验证检查 - 也就是说,您可以在输入时过滤字符/粘贴文本 . 例如,如果字段用于电话号码,则可以在用户键入非数字字符时返回 FALSE ,或者尝试粘贴非数字的文本 .

    您可能会发现一个案例,如果您坚持使用 UIControlEvent-methods. ,您可以重复使用多个控件的代码

  • 1

    我在原始问题中提出的两种方法之间发现的一个关键区别是委托 "shouldChangeCharactersInRange"BEFORE 中的值变为 UITextField . UIControlEventEditingChanged 的目标被称为 UITextField UITextField 中的值更改 .

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

  • 6

    授权方法是使行为同质化的方式 .

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

  • 6

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

    所以 shouldChangeCharactersInRange 实际上无法预测得到的文本 .

相关问题