【发布时间】:2017-05-14 09:35:41
【问题描述】:
背景
我创建了 UITextField 的子类,我想截取用户输入的任何字符并执行一些验证。查看文档,UITextField 符合UIKeyInput,并且当用户在键盘上键入字符时应调用insertText() 方法(documentation)。
这是一个非常基本的例子:
import UIKit
class CustomTextField: UITextField {
override func insertText(_ text: String) {
print("Character Typed: \(text)") // never executes
super.insertText(text)
}
override func deleteBackward() {
print("deleting character") // executes
super.deleteBackward()
}
}
根据 cmets,insertText 永远不会被调用。相反,deleteBackward()(也来自 UIKeyInput)按预期调用。
为什么不使用 UITextFieldDelegate?
我创建子类的原因是控件将在整个应用程序中重复使用。如果有办法将其封装在控件中,那么让每个具有字段实例的 ViewController 重新实现验证逻辑真的没有意义。
虽然我可以通过让我的子类符合UITextFieldDelegate,然后设置delegate = self 来解决这个问题,但我会失去任何其他对象成为该字段代表的能力,创建一个新问题。
问题
在 UITextField 的子类中从键盘截取字符的最佳方法是什么?
似乎覆盖insertText() 不起作用,那么还有其他方法可以监控文本更改事件吗?
【问题讨论】:
标签: ios swift uitextfield uikit