用于安装ViewController的按钮在隐藏后不起作用



我刚刚发现了一个非常奇怪的问题。。。

我有这个button,它正在触发这个function:

@objc func vergessenTapped() {
let forgotPasswordVC = self.storyboard?.instantiateViewController(withIdentifier: "ForgotPasswordVC") as! ForgotPasswordVC
forgotPasswordVC.email = self.emailTextField.text!
self.present(forgotPasswordVC, animated: true, completion: nil)
}

我还有hide/show以上button的这些功能:

// delegate Methode für eye-Button
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
switch textField {
case passwordTextField:
if passwordTextField.text != "" {
eyeButton.isHidden = false
vergessenButton.isHidden = true
} else {
eyeButton.isHidden = true
}
break
default:
break
}
return true
}
// delegate Methode für eye-Button
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {

if textField == passwordTextField {
self.eyeButton.isHidden = true
self.vergessenButton.isHidden = false
}
return true
}
@objc func textFieldDidChange(_ textField: UITextField) {
if textField.text == "" {
self.eyeButton.isHidden = true
self.vergessenButton.isHidden = false
}else {
self.vergessenButton.isHidden = true
self.eyeButton.isHidden = false
}
}

现在是问题:

当我在上面的任何delegate-function隐藏它之前第一次按下button时,ViewControlleritpresents工作得很好。

然而:一旦按钮第一次被隐藏,并且用户在它再次可见后点击它,forgotpasswordViewController的行为就非常奇怪,例如:

1。调用self.dismiss时,`ViewController实际上并没有被解除,而是弹出其下方的

@objc func backButtonTapped(){
self.dismiss(animated: true, completion: nil)
}

2.forgotpasswordViewController中的button(只有一个按钮(没有执行任何操作。

这是一个屏幕视频,以便更好地理解。视频开始22秒后,我开始打字(不知何故,在屏幕上看不到视频,但你可以看到"vergessen",但消失并再次出现。再次出现后,我点击它,正如你所看到的,backButtonconfirmButton都没有像以前那样工作…

这是某种虫子吗???我无法解释。。所以,如果有人在这里帮助我,我将非常感谢!

演示项目:

演示项目

它与显示和隐藏Vergessen按钮无关。问题是你的ForgotPassword视图控制器(实际上还有你的另一个视图控制器(中有这样的东西:

let backButton: UIButton = {
let v = UIButton()
v.translatesAutoresizingMaskIntoConstraints = false
v.setImage(UIImage(named:"down"), for: .normal)
v.addTarget(self, action: #selector(backButtonTapped), for: .touchUpInside)
return v
}()

这有点不对劲。你看到它是什么了吗?当然不是,因为这是所有iOS程序中最肮脏的小陷阱之一。不能在实例属性的初始值设定项中说出v.addTarget(self...。为什么?因为实例self(这里是视图控制器(正处于初始化过程中。所以self在这里没有任何意义。嗯,有时它有意义,有时它没有;对您来说,真正的陷阱是代码曾经工作过。那真的误导了你。(你也被代码编译的事实误导了。在我看来,它不应该。如果有什么安慰的话,我已经提交了一个bug。(

好吧,我可以想出很多解决方案,但传统上我们在这里做的是用lazy var代替let。我想我在你的代码中看到了六个需要这样做的地方。

lazy var backButton: UIButton = { // ... and so on

当你这样做的时候,一切都会很好地开始。

这修复了问题的原因是lazy将该代码的运行推迟到视图控制器本身初始化后的。那么self就意味着它应该意味着什么。

(很抱歉没有lazy let,但我对此无能为力。你只需要说lazy var,然后就这样算了。(

我还应该补充一点,在iOS 14中,你可以(如果你愿意的话(停止调用addTarget(_:action:for:),这样你就不会再陷入这个陷阱了。但该修复程序是在按钮上添加UIAction,仅适用于iOS 14及更高版本。

最新更新