如何在除 ViewController 以外的 class 中将目标添加到 UITextField
How to add target to UITextField in a class other than ViewController
我正在尝试编写一个 class,它有一个方法可以观察 UITextField 对象上的文本变化。
在 ViewController 中时,下面的代码按预期工作:
class ViewController: UIViewController {
@IBOutlet weak var password: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.addTarget(view, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
}
@objc func textFieldDidChange(_ textField: UITextField) {
print(textField.text!)
}
}
所以我写了一个 class 并将方法放入其中:
internal class ListenerModule: NSObject, UITextFieldDelegate {
internal func textWatcher(textField: UITextField!, view: UIViewController!) {
textField.delegate = self
textField.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)
}
@objc internal func textFieldDidChange(_ textField: UITextField) {
print(textField.text!)
}
}
//And in ViewController,
...
ListenerModule().textWatcher(textField: password, view: self)
...
但是不行。
如何将目标添加到 class 或库中的 TextField?
我想这可能是因为你没有坚持你的 ListenerModule
对象。
我相信您在某些函数中这样做ListenerModule().textWatcher(textField: password, view: self)
,因此创建的对象的范围仅限于该函数。
您可以执行以下操作:
// Globally in your UIViewController subclass
var listenerModule: ListenerModule?
// Some set up function after text field is initialized
private func setup()
{
listenerModule = ListenerModule()
// Then call the text watcher, not sure why you pass the view,
// doesn't seem like you use it
listenerModule?.textWatcher(textField: password, view: self)
}
试一试,看看是否能解决您的问题
我正在尝试编写一个 class,它有一个方法可以观察 UITextField 对象上的文本变化。
在 ViewController 中时,下面的代码按预期工作:
class ViewController: UIViewController {
@IBOutlet weak var password: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.addTarget(view, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
}
@objc func textFieldDidChange(_ textField: UITextField) {
print(textField.text!)
}
}
所以我写了一个 class 并将方法放入其中:
internal class ListenerModule: NSObject, UITextFieldDelegate {
internal func textWatcher(textField: UITextField!, view: UIViewController!) {
textField.delegate = self
textField.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)
}
@objc internal func textFieldDidChange(_ textField: UITextField) {
print(textField.text!)
}
}
//And in ViewController,
...
ListenerModule().textWatcher(textField: password, view: self)
...
但是不行。
如何将目标添加到 class 或库中的 TextField?
我想这可能是因为你没有坚持你的 ListenerModule
对象。
我相信您在某些函数中这样做ListenerModule().textWatcher(textField: password, view: self)
,因此创建的对象的范围仅限于该函数。
您可以执行以下操作:
// Globally in your UIViewController subclass
var listenerModule: ListenerModule?
// Some set up function after text field is initialized
private func setup()
{
listenerModule = ListenerModule()
// Then call the text watcher, not sure why you pass the view,
// doesn't seem like you use it
listenerModule?.textWatcher(textField: password, view: self)
}
试一试,看看是否能解决您的问题