Свифт |UIButton вызывает сбой при нажатии - PullRequest
1 голос
/ 25 апреля 2019

Я добавил кнопку на главном экране приложения и при нажатии кнопки появляется новый 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'

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Ответ есть в сообщении об ошибке.Где-то, я думаю, в LoginViewController, есть представление типа 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.

0 голосов
/ 25 апреля 2019

Вы можете добавить распознаватель жестов касания к самой кнопке. Рекомендуется использовать розетки, но это прекрасно работает и полезно для других компонентов пользовательского интерфейса, таких как представления или метки *

let loginTapGesture = UITapGestureRecognizer(target: self,
                                                 action: #selector(loginButtonTapped1))
loginButton.addGestureRecognizer(loginTapGesture)
...