ios - 斯威夫特 | 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'
解决方案
答案在错误消息中。在某个地方,我的猜测是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
。
推荐阅读
- tbb - Wait for one node in a flow graph? / Pull-based execution?
- javascript - javascript, parse an html string and recognize parts
- javascript - Javascript – use X amount of object variables in if statement
- asp.net-mvc - Database recreated everytime Application runs
- python - Making a draft of tic-tac-toe
- javascript - How to use web workers for parallel processing without messing with browser caching?
- r - R:循环应该从字符串返回数字元素
- sql - How to query data from million records of data with date column?
- python - customise environment jupyter notebook
- php - 通过 woocommerce / dokan 中的代码显示的自定义字段