swift 3: 如何在单击后退导航按钮时绕过 textFieldShouldbEginEditing 函数

swift 3: how to bypass the textFieldShouldEndEditing func when Back navigation button is clicked

我已经实现了 textFieldShouldEndEditing 函数来在用户退出字段之前验证输入到每个字段中的数据。如果输入的数据未通过验证,则不允许用户退出该字段。

然而,虽然这工作正常,但我 运行 遇到的问题是当用户单击“后退”导航按钮时它被触发。无论出于何种原因,发生这种情况时,都会显示先前的视图控制器。如果我然后返回到视图控制器,则这些字段根本不可编辑。没有出现键盘,光标没有进入该字段,什么都没有。

我的问题是,当用户单击“后退”按钮时,我如何绕过 textFieldShouldEndEditing 函数,或者我如何检测到在我的验证函数中单击了“后退”按钮,这样我就可以 return true 并得到过去这个问题。任何帮助将不胜感激。

这是我的 textFieldShouldEndEditing 函数(名为 return 的验证函数为真或假):

internal func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
    if (tField.isEditing) {
        return tFieldValidated()
    } else if (oField.isEditing) {
        return oFieldValidated()
    } else {
        return distanceFieldValidated()
    }
 }

这是在 swift 3 和 Xcode 8 中。

好的,我明白了。这是我必须做的:

1 - 我创建了一个全局布尔值 boolCancelled 并将其设置为 false。这用于标记取消按钮是否被单击。

2 - 覆盖导航栏上的后退按钮。为此,我在 viewDidLoad() 方法中添加了以下代码:

self.navigationItem.setHidesBackButton(true, animated: false)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.plain, target: self, action: #selector(RaceDetailVCClass.backButtonAction))

3 - 我还创建了一个 backButtonAction 函数:

func backButtonAction(){
    // set the boolean to True to indicate the Cancel button was clicked
    boolCancelled = true
    self.navigationController?.popToRootViewController(animated: true)
}

4 - 在 vi​​ewDidLoad()

中将 boolCancelled 默认为 false

5 - 在 textFieldShouldEndEditing 函数中添加了对 boolCancelled 的检查:

internal func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
    if (boolCancelled) {
        return true
    } else if (tField.isEditing) {
        return tFieldValidated()
    } else if (oField.isEditing) {
        return oFieldValidated()
    } else {
        return distanceFieldValidated()
    }
}

现在,当我单击“取消”按钮时,textFieldShouldEndEditing 将 return 为真,并且一切正常,因为我需要它工作。