Swift Defer函数似乎不适用于textField委托shouldChangeCharactersIn

时间:2018-08-24 00:17:25

标签: ios swift

我正在运行这段代码

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语句在这里无法按预期工作。我是在想这个吗?还是需要其他尝试?

1 个答案:

答案 0 :(得分:1)

实际上,defer仅在从文档的退出函数的之前执行

  

在将程序控制权转移到defer语句出现的范围之外之前,使用defer语句执行代码。

因此,当您将其与UITextFieldDelegate方法textField(_:shouldChangeCharactersIn:replacementString:)结合使用时,该方法只是询问是否应允许更改,因此有意义的是,此移动发生在更改之前已落实。

如果满足条件,则应调用textField.resignFirstResponder(),然后可以侦听委托方法以调用函数:

optional func textFieldDidEndEditing(_ textField: UITextField) {
    moveResponder(textField)
}