首页 > 解决方案 > 斯威夫特 | UIButton 导致点击时崩溃

问题描述

我在应用程序的主屏幕上添加了一个按钮,点击一个按钮,viewcontroller就会出现一个新按钮。这在模拟器中完全可以正常工作,但是一旦我在实际的 iPhone 中尝试,它就会导致应用程序崩溃。

此外,崩溃仅在登录按钮上引起,而以相同方式制作的注册按钮确实可以正常工作

我将在下面留下代码

 var loginButton = UIButton()
var signUpButton = UIButton()

 loginButton.setTitle("Login", for: .normal)
    loginButton.titleLabel?.textAlignment = .center
    loginButton.backgroundColor = appGreenTheme
    loginButton.titleLabel?.textColor = .white
    loginButton.layer.cornerRadius = 20
    loginButton.titleLabel?.font = UIFont.systemFont(ofSize: 20)
    loginButton.setBackgroundImage(UIImage(named: "pinkOrangeGradientPDF"), for: .normal)
    loginButton.clipsToBounds = true


    signUpButton.setTitle("Sign Up", for: .normal)
    signUpButton.setTitleColor(.black, for: .normal)
    signUpButton.titleLabel?.textAlignment = .center
    signUpButton.backgroundColor = .white
    signUpButton.titleLabel?.textColor = .black
    signUpButton.layer.cornerRadius = 20
    signUpButton.titleLabel?.font = UIFont.systemFont(ofSize: 20)


    loginButton.addTarget(self, action: #selector(loginButtonTapped1(_:)), for: .allTouchEvents)

    signUpButton.addTarget(self, action: #selector(signUpButtonTapped1(_:)), for: .allTouchEvents)

 ///////////////////////////////////////////////////

   @objc func loginButtonTapped1(_ sender: UIButton) {
    let nav = UINavigationController(rootViewController: LoginViewController())
self.present(nav, animated: true, completion: nil)
}

@objc func signUpButtonTapped1(_ sender: UIButton) {
    let nav = UINavigationController(rootViewController: SignUpViewController())
    self.present(nav, animated: true, completion: nil)
}

我还尝试了“touchUpInside”事件。再次,它在模拟器中完美运行,但在物理设备中却不行。

欢迎任何帮助。

以下是日志中显示的错误

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[SparkGPS.LoginView addTarget:action:forControlEvents:]: unrecognized selector sent to instance 0x13dd4c740'

标签: iosswiftuinavigationcontrolleruibuttonpresentviewcontroller

解决方案


答案在错误消息中。在某个地方,我的猜测是LoginViewController,有一个 type 的视图LoginView。这种观点正在呼唤addTarget(_:action:for:)LoginView不是子类UIControl,也没有addTarget(_:action:for:). 它导致了崩溃。

让我分解的部分-[SparkGPS.LoginView addTarget:action:forControlEvents:]

  • -开头的意思是它是一个实例方法,而不是静态或类方法。

  • SparkGPS.LoginView是模块和类。模块是框架或应用程序的另一个词。在这种情况下,看起来您有一个名为的应用程序SparkGPS和一个名为 的类LoginView

  • addTarget:action:forControlEvents:是 Objective-C 的名称addTarget(_:action:for:)

最后,“选择器发送到实例”意味着变量调用方法。选择器是一种识别方法的方式,一个实例存储在一个变量中。例如,在您的代码中,您有loginButton.setTitle("Login", for: .normal). 这可以用setTitle(_:for:)发送给实例的措辞来表达loginButton


推荐阅读