566 votes

Comment créer un UIAlertView en Swift ?

J'ai travaillé à la création d'un UIAlertView en Swift, mais pour une raison quelconque, je n'arrive pas à obtenir la bonne déclaration car j'obtiens cette erreur :

Impossible de trouver une surcharge pour 'init' qui accepte les données fournies. fournis

Voici comment je l'ai écrit :

let button2Alert: UIAlertView = UIAlertView(title: "Title", message: "message",
                     delegate: self, cancelButtonTitle: "OK", otherButtonTitles: nil)

Alors pour l'appeler j'utilise :

button2Alert.show()

Pour l'instant, il se bloque et je n'arrive pas à trouver la bonne syntaxe.

6 votes

UIAlertView y UIActionSheet a été remplacé par UIAlertController dans iOS 8, avez-vous regardé cela ?

0 votes

Assurez-vous que la classe qui self appartient à adopte le protocole UIAlertViewDelegate (la manière recommandée de le faire, en Swift, est avec une extension).

0 votes

@Adam : J'ai inversé votre retagging. Le site Swift3 est pour "des questions directement liées aux changements de la version 3 du langage de programmation Swift d'Apple." Et je ne pense pas que "Si les réponses montrent clairement que le problème de la question a été causé par autre chose que ce que l'auteur de la question pensait, le retagging est très utile." de meta.stackoverflow.com/questions/252079/ s'applique ici.

1012voto

Oscar Swanros Points 2853

De la UIAlertView classe :

// UIAlertView est obsolète. Utilisez UIAlertController avec un preferredStyle de UIAlertControllerStyleAlert au lieu de

Sous iOS 8, vous pouvez le faire :

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)

Maintenant UIAlertController est une classe unique pour créer et interagir avec ce que nous connaissions sous le nom de UIAlertView et UIActionSheet sur iOS 8.

Edita: Pour gérer les actions :

alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { action in
    switch action.style{
    case .Default:
        print("default")

    case .Cancel:
        print("cancel")

    case .Destructive:
        print("destructive")
    }
}}))

Modifier pour Swift 3 :

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)

Modifier pour Swift 4.x :

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
    switch action.style{
        case .default:
        print("default")

        case .cancel:
        print("cancel")

        case .destructive:
        print("destructive")

    }
}))
self.present(alert, animated: true, completion: nil)

3 votes

Où avez-vous vu que UIAlertView est déprécié ? Je ne le vois pas dans la documentation ?

9 votes

Cmd + Cliquez sur le UIAlertView et le commentaire se trouve juste au-dessus de la déclaration de la classe.

2 votes

Je vais répondre à ma propre question pour tous ceux qui sont curieux alert.addAction(UIAlertAction(title : "Annuler", style : UIAlertActionStyle.Cancel, handler : { (ACTION :UIAlertAction !)in }))

117voto

Ben Gottlieb Points 59900

Vous pouvez créer une UIAlert à l'aide du constructeur standard, mais le constructeur "hérité" semble ne pas fonctionner :

let alert = UIAlertView()
alert.title = "Alert"
alert.message = "Here's a message"
alert.addButtonWithTitle("Understood")
alert.show()

9 votes

UIAlertView est déprécié. Utilisez plutôt UIAlertController avec un preferredStyle de UIAlertControllerStyleAlert.

17 votes

@Zorayr UIAlertController n'est disponible qu'à partir d'iOS 8. Veuillez également le mentionner lorsque vous suggérez son utilisation. Il y a des situations où le support d'iOS7 est encore souhaité et les gens pourraient passer à côté du problème. La dépréciation ne signifie pas "ne l'utilisez plus jamais".

2 votes

Cela fonctionne si votre application vise toujours iOS 7. Cependant, l'idéal serait d'utiliser UIAlertView uniquement lorsque UIAlertController n'est pas disponible. if NSClassFromString("UIAlertController") != nil { /* use UIAlertController * / } else { /* use UIAlertView * / }

11voto

Anit Kumar Points 11

Afficher UIAlertView en langage swift :-

Protocole UIAlertViewDelegate

let alert = UIAlertView(title: "alertView", message: "This is alertView", delegate:self, cancelButtonTitle:"Cancel", otherButtonTitles: "Done", "Delete")
alert.show()

Afficher UIAlertViewController en langage swift :-

let alert = UIAlertController(title: "Error", message: "Enter data in Text fields", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)

9voto

Pravat Maskey Points 4003

J'ai trouvé celui-ci,

var alertView = UIAlertView();
alertView.addButtonWithTitle("Ok");
alertView.title = "title";
alertView.message = "message";
alertView.show();

Ce n'est pas très bon, mais ça marche :)

Mise à jour :

mais j'ai trouvé sur le fichier d'en-tête comme :

extension UIAlertView {
    convenience init(title: String, message: String, delegate: UIAlertViewDelegate?, cancelButtonTitle: String?, otherButtonTitles firstButtonTitle: String, _ moreButtonTitles: String...)
}

quelqu'un peut peut-être l'expliquer.

0 votes

Apparemment, UIAlertView a été déprécié dans iOS 8 et nous utilisons maintenant UIAlertController avec un style préféré de UIAlertControllerStyleAlert.

6 votes

Si vous exécutez une application qui doit être rétrocompatible avec iOS7.1 et que vous l'écrivez en Swift, le UIAlertController fera planter l'appareil cible. Vous devez prendre en charge les UIAlertViews existantes pour iOS7.

0 votes

Je pense que ce n'est pas Swift qui causerait un crash, mais plutôt le fait que le UIAlertController n'est pas disponible avant iOS 8

3voto

Oscar Wu Points 11

La raison pour laquelle cela ne fonctionne pas est qu'une valeur que vous avez passée à la fonction n'est pas correcte. swift n'est pas comme Objective-C, vous pouvez mettre nil aux arguments qui sont de type classe sans aucune restriction (peut-être). L'argument otherButtonTitles est défini comme non-optionnel et son type ne comporte pas de ( ?) à sa fin. Vous devez donc lui passer une valeur concrète.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X