我正在运行这段代码
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
//does stuff
defer {
moveResponder(textField) // this assigns a new first responder after the character is input
}
return true
延迟应该在函数结束后运行。但是,当我运行这段代码时,响应者的确确实转移到了新的响应者,然后实现了字符更改。我希望在更改字符后将其移动,但是defer语句在这里无法按预期工作。我是在想这个吗?还是需要其他尝试?
答案 0 :(得分:1)
实际上,defer
仅在从文档的退出函数的之前执行
在将程序控制权转移到defer语句出现的范围之外之前,使用defer语句执行代码。
因此,当您将其与UITextFieldDelegate
方法textField(_:shouldChangeCharactersIn:replacementString:)
结合使用时,该方法只是询问是否应允许更改,因此有意义的是,此移动发生在更改之前已落实。
如果满足条件,则应调用textField.resignFirstResponder()
,然后可以侦听委托方法以调用函数:
optional func textFieldDidEndEditing(_ textField: UITextField) {
moveResponder(textField)
}