在Swift中UITextFieldDelegate如何在文本被编辑时触发动作?

7lrncoxx  于 2023-08-02  发布在  Swift
关注(0)|答案(4)|浏览(98)

我有一个ViewController,它继承自UITextFieldDelegate,并作为视图中文本字段的代理。我希望在编辑文本时触发操作。
我尝试实现了textField方法,该方法在UITextFieldDelegate documentation中列出:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool

字符串
该文档将此textField方法描述为当文本 * 应该 * 更改时触发,这发生在 * 指定文本更改 * 之前 *。下面是文档中的一行:
询问代理是否应更改指定的文本。
由于此textField方法在文本更改 * 之前 * 而不是 * 之后 * 触发,因此textField.text处可用的文本包含 * 先前 * 的文本,而不是更改后更新的 * 新 * 文本。为了访问新文本,我需要将rangereplacementString参数应用于textField.text,以模拟文本将如何更改。
是否有一个替代textField方法的方法,该方法不是在文本 * 将要 * 更改时触发,而是在文本 * 已经 * 更改时触发?我在想,直接使用修改后的文本可以避免我事先对修改的模仿。

mtb9vblg

mtb9vblg1#

valueChanged添加一个带有选择器的目标,您将能够获得所需的事件。

// adding target
textField.addTarget(self, action: #selector(textChanged), for: .valueChanged)
// selector
@objc func textChanged(_ textField: UITextField) {
    print(textField.text)
}

字符串

biswetbf

biswetbf2#

你试过textDidChangeNotification吗?你将不得不为keyboarddidshow(notification)添加观察者。对于您的参考:https://stackoverflow.com/a/52325593

zpgglvta

zpgglvta3#

只需将扩展UITextfieldDelegate写入viewController,您将拥有这些预定义的函数:

func textFieldDidBeginEditing(_ textField: UITextField) {
        
}

func textFieldDidEndEditing(_ textField: UITextField) {
        
}

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        
}

字符串

x6h2sr28

x6h2sr284#

只是一个调整到弗兰肯斯坦的版本,它的工作正常:

textField.addTarget(self, action: #selector(textChanged), for: .editingChanged)

@objc func textChanged(_ textField: UITextField) {
        print(textField.text)
}

字符串

相关问题