web-dev-qa-db-fra.com

Swift - La valeur du type ViewController n'a pas de membre * functionName *

Dans mon application, j'ai plusieurs scénarios, chacun affichant une UIAlertController différente. J'ai donc créé une fonction pour afficher cette alerte, mais je ne peux pas sembler appeler l'auto.Fonction dans "okAction". Je reçois cette erreur:

La valeur de type 'ViewController' n'a pas de membre 'doAction'

Voici le code:

func showAlertController( titleOfAlert: String, messageOfAlert : String, doAction : () )
{
    let refreshAlert = UIAlertController(title: titleOfAlert, message: messageOfAlert, preferredStyle: .Alert)

    let okAction = UIAlertAction(title: "Save", style: UIAlertActionStyle.Default) {
        UIAlertAction in

        self.doAction()
    }

    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Default) {
        UIAlertAction in
    }

    refreshAlert.addAction(okAction)
    refreshAlert.addAction(cancelAction)

    self.presentViewController(refreshAlert, animated: true, completion: nil)
}

Voici l'une des fonctions que j'appelle:

func changeLabel1()
{
    label.text = "FOR BUTTON 1"
}

Comment puis-je le résoudre ?

6
SergeH

De votre code doAction est le troisième paramètre de la fonction showAlertController

so Premièrement: changez doAction: () en doAction: () -> () Cela signifie que doAction est un Closure sans paramètre et retour vide.

Deuxièmement: l'appel ne devrait pas être self.doAction () mais juste doAction () Parce que c'est un paramètre et non une variable d'instance

1
Nikita Kurtin

Je pense que la bonne façon de spécifier une fermeture est la suivante: 

func showAlertController( titleOfAlert: String, messageOfAlert : String, doAction : (() -> Void) ){

   // and then call it like that
   doAction()

}

Le point clé ici est que vous ne pouvez pas appeler this.doAction() car le paramètre que vous transmettez à la fonction n'est pas une propriété de votre contrôleur, n'est-ce pas? 

0
the_critic