gpt4 book ai didi

ios - 隐藏它后实例化 View Controller 的按钮不起作用

转载 作者:行者123 更新时间:2023-12-01 16:05:04 25 4
gpt4 key购买 nike

我有一个我刚刚发现的非常奇怪的问题......
我有这个 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
}
}
现在是 问题:
当我在上面的任何 button 隐藏它之前第一次按下 delegate-function 时, ViewControllerpresents 工作得很好。
但是:一旦按钮第一次被隐藏,并且用户在它再次可见后点击它, forgotpasswordViewController 的行为真的很奇怪,例如:
1. 当调用 self.dismiss 时,`ViewController 实际上没有被解除,而是弹出它下面的一个。
@objc func backButtonTapped(){
self.dismiss(animated: true, completion: nil)
}
2. button 中的 forgotpasswordViewController(那里只有一个按钮)没有做任何事情。
这是一个 Screenvideo 以便更好地理解。进入视频 22 秒后我开始输入(不知何故在屏幕视频上不可见,但您可以看到“vergessen”但消失并再次出现。再次出现后,我单击它,如您所见, backButtonconfirmButton 都不像他们以前做过...
这是某种bug吗???我无法解释它..所以如果有人在这里帮助我,我将不胜感激!
演示项目:
Demo-Project

最佳答案

它与显示和隐藏 Vergessen 按钮无关。问题在于您的 ForgotPassword View Controller (实际上也是您的其他 View Controller )中的这种事情:

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 (这里是 View Controller )是我们正在初始化的东西。所以 self在这里没有任何意义。好吧,有时它有意义,有时则没有;对你来说真正的陷阱是代码曾经工作过。那真的误导了你。 (你也被代码编译的事实误导了。在我看来,它不应该。如果有任何安慰的话,我有一个 filed a bug 。)
好的,所以我可以想到很多解决方案,但是传统上我们在这里做的是替换 letlazy var .我想我在你的代码中有六个地方需要这样做。
lazy var backButton: UIButton = { // ... and so on
当你这样做时,一切都会开始正常工作。
这解决了问题的原因是 lazy将该代码的运行推迟到 View Controller 本身被初始化之后。那么 self意味着它应该意味着什么。
(很抱歉,没有 lazy let ,但我对此无能为力。你只需要说 lazy var 就可以了。)
我还应该补充一点,iOS 14 中的新功能,您可以(如果您愿意)停止调用 addTarget(_:action:for:) ,这样你就不会再落入这个陷阱了。但修复,即向按钮添加 UIAction,仅适用于 iOS 14 及更高版本。

关于ios - 隐藏它后实例化 View Controller 的按钮不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63892806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com