Почему я получаю "Только методы экземпляра могут быть объявлены @IBAction" в этом коде? - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь создать приложение для социальной сети ios для школьного проекта.Моя @IBAction функция для входа не работает, и я не знаю почему.Ошибка, которую я получаю: «Только методы экземпляра могут быть объявлены @IBAction»

Вот мой код:

class ViewController: UIViewController {
    @IBOutlet weak var emailField: UITextField!
    @IBOutlet weak var passwordField: UITextField!`

    var userUid: String!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewDidAppear(_ animated: Bool){
        if let _ = KeychainWrapper.standard.string(forKey: "uid") {
            performSegue(withIdentifier: "Messages", sender: nil)
        }

        func prepare(for segue: UIStoryboardSegue, sender: Any?) {

            if segue.identifier == "SignUp" {

                if let destination = segue.destination as? SignUpVC {
                    if self.userUid != nil{
                        destination.userUid = userUid
                    }
                    if self.emailField.text != nil {
                        destination.emailField = emailField.text
                    }
                    if self.passwordField.text != nil {
                        destination.passwordField = passwordField.text
                    }
                }
            }
        }

        @IBAction func SignIn (_ sender: AnyObject) {
        if let email = emailField.text, let password = passwordField.text{
            Auth.auth().signIn(withEmail: email, password: password, completion:{
                (user, error) in
                if error == nil{
                    self.userUid = user?.user.uid
                    KeychainWrapper.standard.set(self.userUid, forKey: "uid")
                    self.performSegue(withIdentifier: "Messages", sender: nil)
                } else {
                    self.performSegue(withIdentifier: "SignUp", sender: nil)
                }
            })
        }
    }
}
}

Ответы [ 4 ]

0 голосов
/ 08 февраля 2019
func prepare(for segue: UIStoryboardSegue, sender: Any?) {

            if segue.identifier == "SignUp" {

                if let destination = segue.destination as? SignUpVC {
                    if self.userUid != nil{
                        destination.userUid = userUid
                    }
                    if self.emailField.text != nil {
                        destination.emailField = emailField.text
                    }
                    if self.passwordField.text != nil {
                        destination.passwordField = passwordField.text
                    }
                }
            }
        }

        @IBAction func SignIn (_ sender: AnyObject) {
        if let email = emailField.text, let password = passwordField.text{
            Auth.auth().signIn(withEmail: email, password: password, completion:{
                (user, error) in
                if error == nil{
                    self.userUid = user?.user.uid
                    KeychainWrapper.standard.set(self.userUid, forKey: "uid")
                    self.performSegue(withIdentifier: "Messages", sender: nil)
                } else {
                    self.performSegue(withIdentifier: "SignUp", sender: nil)
                }
            })
        }

должно быть снаружи viewDidAppear

0 голосов
/ 08 февраля 2019

Причина в том, что ваш SignIn не является методом экземпляра, это вложенная функция внутри viewDidAppear.Добавьте еще одну закрывающую скобку в viewDidAppear

override func viewDidAppear(_ animated: Bool){
    if let _ = KeychainWrapper.standard.string(forKey: "uid") {
        performSegue(withIdentifier: "Messages", sender: nil)
    }
}

и удалите одну в конце файла

0 голосов
/ 08 февраля 2019

Вы готовитесь к переходу, и функция входа была вложена в метод viewDidAppear.Использование комментариев может помочь визуально разбить функции.

class ViewController: UIViewController {
    // MARK: Outlets
    @IBOutlet weak var emailField: UITextField!
    @IBOutlet weak var passwordField: UITextField!`
    // MARK: Properties
    var userUid: String!
    // MARK: Lifecycle
    override func viewDidAppear(_ animated: Bool) {
        if let _ = KeychainWrapper.standard.string(forKey: "uid") {
            performSegue(withIdentifier: "Messages", sender: nil)
        }
    }
    // MARK: Navigation
    func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "SignUp" {

            if let destination = segue.destination as? SignUpVC {
                if self.userUid != nil{
                    destination.userUid = userUid
                }
                if self.emailField.text != nil {
                    destination.emailField = emailField.text
                }
                if self.passwordField.text != nil {
                    destination.passwordField = passwordField.text
                }
            }
        }
    }
    // MARK: Actions
    @IBAction func SignIn (_ sender: AnyObject) {
        if let email = emailField.text, let password = passwordField.text{
            Auth.auth().signIn(withEmail: email, password: password, completion:{
                (user, error) in
                if error == nil{
                    self.userUid = user?.user.uid
                    KeychainWrapper.standard.set(self.userUid, forKey: "uid")
                    self.performSegue(withIdentifier: "Messages", sender: nil)
                } else {
                    self.performSegue(withIdentifier: "SignUp", sender: nil)
                }
            })
        }
    }
}
0 голосов
/ 08 февраля 2019

функция func prepare(for segue: UIStoryboardSegue, sender: Any?) должна находиться в области видимости класса, не вложенной в viewDidAppear

override func viewDidAppear(_ animated: Bool){
    super.viewDidAppear(animated)
    if let _ = KeychainWrapper.standard.string(forKey: "uid"){
        performSegue(withIdentifier: "Messages", sender: nil)
    } 
}

@IBAction func SignIn (_ sender: AnyObject) {
    if let email = emailField.text, let password = passwordField.text{
        Auth.auth().signIn(withEmail: email, password: password, completion:{
            (user, error) in
            if error == nil{
                self.userUid = user?.user.uid
                KeychainWrapper.standard.set(self.userUid, forKey: "uid")
                self.performSegue(withIdentifier: "Messages", sender: nil)
            } else {
                self.performSegue(withIdentifier: "SignUp", sender: nil)
            }
        })
    }
} 
func prepare(for segue: UIStoryboardSegue, sender: Any?){ 
    if segue.identifier == "SignUp"{ 
        if let destination = segue.destination as? SignUpVC { 
            if self.userUid != nil {
                destination.userUid = userUid
            }  
            destination.emailField = emailField.text 
            destination.passwordField = passwordField.text 
        }
    } 
}
...