0
votes

Pourquoi dois-je obtenir "uniquement des méthodes d'instance peut être déclarée @ibaction" dans ce code?

J'essaie de créer une application de réseau social pour iOS pour un projet d'école. Mon @ibaction code> fonction pour la connexion ne fonctionne pas et je ne sais pas pourquoi. L'erreur que je reçois est: "Seules les méthodes d'instance peuvent être déclarées @ibaction"

Voici mon code: P>

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)
                }
            })
        }
    }
}
}


3 commentaires

Pourquoi votre Func Préparez-vous (pour SEGUE: UISTORYBOODSUEGUEGE, SENDER: TOUT?) Méthode à l'intérieur de la viewwillappear? c'est une mauvaise copie / pâte à ici ou vous devez le déplacer. Il semble également que votre ibaction pourrait également être à l'intérieur d'une autre méthode, que ce soit ou que vous avez déclaré une statique quelque part. S'il vous plaît ranger ce code, il est assez difficile de lire et de causer évidemment des problèmes.


Votre erreur est en scopes. Les fonctions ne peuvent pas contenir d'autres fonctions à Swift.


Les fonctions peuvent contenir des fonctions, cependant, mettant la préparation: Intérieur ViewDidLoadLoad: est incorrecte.


4 Réponses :


0
votes

Fonction Func Préparez (pour SEGUE: UISTORYBOODSEGUEGUEGUEGUEGE, SENDER: Tout?) CODE> doit être en classe Scope non imbriqué à l'intérieur ViewDidAppear CODE>

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 
        }
    } 
}


0 commentaires

1
votes

La raison en est que votre Signin n'est pas une méthode d'instance, c'est une fonction imbriquée dans ViewDidAppear . Ajoutez une autre parenthèse de fermeture dans viewDidAppear xxx

et retirez-en à la fin du fichier


0 commentaires

0
votes

Vous vous préparez à SEGUE et la fonction de connexion a été nichée à l'intérieur de la méthode code> ViewDididAppear code>. Utiliser des commentaires peut aider à briser les fonctions visuellement.

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 commentaires

0
votes
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)
                }
            })
        }
should be outside viewDidAppear

0 commentaires