Swift - Valeur de Type ViewController n'a pas de membre *functionName*
Dans mon application j'ai plusieurs scénarios, chacun montrant un autre UIAlertController
, j'ai donc créé une fonction pour afficher cette alerte, mais je n'arrive pas à appeler l'auto.Fonction à l'intérieur de la "okAction" . J'obtiens cette erreur :
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 je vais appeler :
func changeLabel1()
{
label.text = "FOR BUTTON 1"
}
Comment puis-je le résoudre ?
OriginalL'auteur SergeH | 2015-12-26
Vous devez vous connecter pour publier un commentaire.
supprimer la
self
en face dedoAction()
puisque vous n'avez pas d'appel à l'action sur l'objet en soi.Si vous n'avez que le compilateur va vous dire
Invalid use of '()' to call a value of non-function type '()'
. C'est le cas parce quedoAction
est pas une fonction mais un tuple vide. Une fonction des paramètres d'entrée et un type de retour. Par conséquent, le type dedoAction
devrait être() -> Void
- il ne prend pas d'entrée et renvoieVoid
, c'est à dire ne retourne rien.Le code devrait ressembler à ceci:
Si vous souhaitez passer la
action
à ladoAction
méthode, vous devrez changer le type de(UIAlertAction) -> Void
et de l'appeler viadoAction(action)
.OriginalL'auteur luk2302
À partir de votre code doAction est le troisième paramètre de la fonction
showAlertController.
donc
Première: changement doAction : () à doAction: ()->()
Cela signifie que doAction est un Fermeture sans paramètres et de retour à vide.
Deuxième: l'appel ne devrait pas être auto.doAction() mais juste doAction()
Parce que c'est un paramètre et non pas une variable d'instance
OriginalL'auteur Nikita Kurtin
Je pense que la bonne façon de spécifier une fermeture est comme ceci:
L'essentiel ici est que vous ne pouvez pas appeler
this.doAction()
parce que le paramètre que vous passer dans la fonction n'est pas une propriété sur votre contrôleur, droit ?Il a travaillé. J'ai pris luk2302 de la réponse, car elle a expliqué ce qui n'allait pas. Merci bien!
Pas de soucis, l'essentiel, c'est que vous avez résolu votre problème. Je voulais étendre sur ma réponse, mais j'ai vu que vous avez déjà trouvé ce que vous cherchiez...
OriginalL'auteur the_critic