Comment créer un UIAlertView dans Swift?


481

J'ai travaillé pour créer un UIAlertView dans Swift, mais pour une raison quelconque, je ne peux pas obtenir la bonne déclaration parce que j'obtiens cette erreur:

Impossible de trouver une surcharge pour 'init' qui accepte les arguments fournis

Voici comment je l'ai écrit:

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

Ensuite, pour l'appeler, j'utilise:

button2Alert.show()

En ce moment, il plante et je n'arrive pas à avoir la bonne syntaxe.


5
UIAlertViewet UIActionSheeta été remplacé par UIAlertControllerdans iOS 8, avez-vous regardé cela?
Popeye

Assurez-vous que la classe qui selfappartient à adopte le protocole UIAlertViewDelegate(la méthode recommandée pour cela, dans Swift, est avec une extension).
Nicolas Miari

@Adam: J'ai annulé votre redéfinition. La balise swift3 est destinée aux «questions directement liées aux modifications de la version 3 du langage de programmation Swift d'Apple». Et je ne pense pas que "Si les réponses indiquent clairement que le problème dans la question a été causé par autre chose que ce que le demandeur pensait, la redéfinition est très utile." de meta.stackoverflow.com/questions/252079/… s'applique ici.
Martin R

1
@MartinR Je ne sais pas comment les questions peuvent être mises à jour pour montrer qu'il existe des réponses qui s'appliquent à une version actuelle de Swift; il y a beaucoup de vieux trucs inutiles ici et [swift] trouve tout cela avec l'utile. Je ne suis pas convaincu que cette redéfinition soit annulée, mais j'aimerais qu'il y ait un moyen définitif de résoudre ce problème. (Je souhaite que les réponses aient des balises.)
Adam Eberbach

Réponses:


897

De la UIAlertViewclasse:

// UIAlertView est obsolète. Utilisez plutôt UIAlertController avec un style préféré de UIAlertControllerStyleAlert

Sur iOS 8, vous pouvez faire ceci:

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)

Il UIAlertControllers'agit maintenant d' une classe unique pour créer et interagir avec ce que nous connaissions comme UIAlertViews et UIActionSheets sur iOS 8.

Modifier: 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
Où avez-vous vu que UIAlertView est obsolète? Je ne vois pas cela dans la documentation?
BlueBear

9
Cmd + Cliquez sur la UIAlertViewclasse et le commentaire se trouve juste en haut de la déclaration de classe.
Oscar Swanros du

2
Je répondrai à ma propre question pour quiconque est curieux alert.addAction (UIAlertAction (title: "Cancel", style: UIAlertActionStyle.Cancel, handler: {(ACTION: UIAlertAction!) In}))
altyus

5
Quel est l'intérêt des cas d'annulation et de destruction car ce sera toujours ce que vous avez spécifié .Default?
Utilisateur

4
La lecture de cette réponse au cas de changement que vous avez fait n'est pas nécessaire . Le commutateur n'est utile que si le type ou le titre ne sont pas codés en dur, c'est-à-dire qu'ils sont dynamiques: vous pouvez avoir une série de boutons dynamiques afin que les titres ne soient pas codés en dur. Et puis, le gestionnaire devra peut-être passer le titre choisi à un autre appel de méthode
Honey

465

Un bouton

Capture d'écran d'un bouton

class ViewController: UIViewController {

    @IBAction func showAlertButtonTapped(_ sender: UIButton) {

        // create the alert
        let alert = UIAlertController(title: "My Title", message: "This is my message.", preferredStyle: UIAlertController.Style.alert)

        // add an action (button)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))

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

Deux boutons

Capture d'écran de l'alerte à deux boutons

class ViewController: UIViewController {

    @IBAction func showAlertButtonTapped(_ sender: UIButton) {

        // create the alert
        let alert = UIAlertController(title: "UIAlertController", message: "Would you like to continue learning how to use iOS alerts?", preferredStyle: UIAlertController.Style.alert)

        // add the actions (buttons)
        alert.addAction(UIAlertAction(title: "Continue", style: UIAlertAction.Style.default, handler: nil))
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil))

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

Trois boutons

entrez la description de l'image ici

class ViewController: UIViewController {

    @IBAction func showAlertButtonTapped(_ sender: UIButton) {

        // create the alert
        let alert = UIAlertController(title: "Notice", message: "Lauching this missile will destroy the entire universe. Is this what you intended to do?", preferredStyle: UIAlertController.Style.alert)

        // add the actions (buttons)
        alert.addAction(UIAlertAction(title: "Remind Me Tomorrow", style: UIAlertAction.Style.default, handler: nil))
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil))
        alert.addAction(UIAlertAction(title: "Launch the Missile", style: UIAlertAction.Style.destructive, handler: nil))

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

Manipulation des robinets de bouton

Le handlerétait nildans les exemples ci - dessus. Vous pouvez remplacer nilpar une fermeture pour faire quelque chose lorsque l'utilisateur appuie sur un bouton. Par exemple:

alert.addAction(UIAlertAction(title: "Launch the Missile", style: UIAlertAction.Style.destructive, handler: { action in

    // do something like...
    self.launchMissile()

}))

Remarques

  • Plusieurs boutons n'ont pas nécessairement besoin d'utiliser différents UIAlertAction.Styletypes. Ils pourraient tous l'être .default.
  • Pour plus de trois boutons, envisagez d'utiliser une feuille d'action. La configuration est très similaire. Voici un exemple.

2
Y a-t-il une propriété déléguée dans UIAlertController? dans UIAlertView, il y a une propriété de délégué que nous définissons parfois sur self, Y a-t-il quelque chose comme ça dans UIAlertController ?? Je suis nouveau, aidez-moi s'il vous plaît
ArgaPK

Belle réponse - Maintenant, comment pouvons-nous passer à une nouvelle vue dans le gestionnaire?
That1Guy

114

Vous pouvez créer un UIAlert à l'aide du constructeur standard, mais celui «hérité» ne semble pas fonctionner:

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

8
UIAlertView est obsolète. Utilisez plutôt UIAlertController avec un style préféré de UIAlertControllerStyleAlert.
Zorayr du

16
@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 iOS7 est toujours souhaité et les gens peuvent manquer le problème. La dépréciation ne signifie pas "ne plus jamais l'utiliser".
Sami Kuhmonen

2
Cela fonctionne si votre application cible toujours iOS 7. Cependant, idéalement, UIAlertView ne doit être utilisé que lorsque UIAlertController n'est pas disponible. if NSClassFromString ("UIAlertController")! = nil {/ * use UIAlertController * /} else {/ * use UIAlertView * /}
phatblat

UIAlertview () est désormais obsolète dans iOS 9
Rizwan Ahmed

31

Dans Swift 4.2 et Xcode 10

Méthode 1:

ALERTE SIMPLE

let alert = UIAlertController(title: "Your title", message: "Your message", preferredStyle: .alert)

     let ok = UIAlertAction(title: "OK", style: .default, handler: { action in
     })
     alert.addAction(ok)
     let cancel = UIAlertAction(title: "Cancel", style: .default, handler: { action in
     })
     alert.addAction(cancel)
     DispatchQueue.main.async(execute: {
        self.present(alert, animated: true)
})

Méthode 2:

ALERTE AVEC CLASSE PARTAGÉE

Si vous voulez un style de classe partagé (écrivez une fois, utilisez partout)

import UIKit
class SharedClass: NSObject {//This is shared class
static let sharedInstance = SharedClass()

    //Show alert
    func alert(view: UIViewController, title: String, message: String) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
        })
        alert.addAction(defaultAction)
        DispatchQueue.main.async(execute: {
            view.present(alert, animated: true)
        })
    }

    private override init() {
    }
}

Appelez maintenant une alerte comme celle-ci dans tous les articles

SharedClass.SharedInstance.alert(view: self, title: "Your title here", message: "Your message here")

Méthode 3:

PRÉSENTE ALERTE EN HAUT DE TOUTES LES FENÊTRES

Si vous souhaitez présenter une alerte au-dessus de toutes les vues, utilisez ce code

func alertWindow(title: String, message: String) {
    DispatchQueue.main.async(execute: {
        let alertWindow = UIWindow(frame: UIScreen.main.bounds)
        alertWindow.rootViewController = UIViewController()
        alertWindow.windowLevel = UIWindowLevelAlert + 1

        let alert2 = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let defaultAction2 = UIAlertAction(title: "OK", style: .default, handler: { action in
        })
        alert2.addAction(defaultAction2)

        alertWindow.makeKeyAndVisible()

        alertWindow.rootViewController?.present(alert2, animated: true, completion: nil)
    })
}

Appel de fonction

SharedClass.sharedInstance.alertWindow(title:"This your title", message:"This is your message")

Méthode 4:

Alerte avec extension

extension  UIViewController {

    func showAlert(withTitle title: String, withMessage message:String) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let ok = UIAlertAction(title: "OK", style: .default, handler: { action in
        })
        let cancel = UIAlertAction(title: "Cancel", style: .default, handler: { action in
        })
        alert.addAction(ok)
        alert.addAction(cancel)
        DispatchQueue.main.async(execute: {
            self.present(alert, animated: true)
        })
    }
}

Maintenant appelle comme ça

//Call showAlert function in your class
@IBAction func onClickAlert(_ sender: UIButton) {
    showAlert(withTitle:"Your Title Here", withMessage: "YourCustomMessageHere")
}

Méthode 5:

ALERTE AVEC TEXTFIELDS

Si vous souhaitez ajouter des champs de texte pour alerter.

//Global variables
var name:String?
var login:String?

//Call this function like this:  alertWithTF() 
//Add textfields to alert 
func alertWithTF() {

    let alert = UIAlertController(title: "Login", message: "Enter username&password", preferredStyle: .alert)
    // Login button
    let loginAction = UIAlertAction(title: "Login", style: .default, handler: { (action) -> Void in
        // Get TextFields text
        let usernameTxt = alert.textFields![0]
        let passwordTxt = alert.textFields![1]
        //Asign textfileds text to our global varibles
        self.name = usernameTxt.text
        self.login = passwordTxt.text

        print("USERNAME: \(self.name!)\nPASSWORD: \(self.login!)")
    })

    // Cancel button
    let cancel = UIAlertAction(title: "Cancel", style: .destructive, handler: { (action) -> Void in })

    //1 textField for username
    alert.addTextField { (textField: UITextField) in
        textField.placeholder = "Enter username"
        //If required mention keyboard type, delegates, text sixe and font etc...
        //EX:
        textField.keyboardType = .default
    }

    //2nd textField for password
    alert.addTextField { (textField: UITextField) in
        textField.placeholder = "Enter password"
        textField.isSecureTextEntry = true
    }

    // Add actions
    alert.addAction(loginAction)
    alert.addAction(cancel)
    self.present(alert, animated: true, completion: nil)

}

Méthode 6:

Alerte dans SharedClass avec extension

//This is your shared class
import UIKit

 class SharedClass: NSObject {

 static let sharedInstance = SharedClass()

 //Here write your code....

 private override init() {
 }
}

//Alert function in shared class
extension UIViewController {
    func showAlert(title: String, msg: String) {
        DispatchQueue.main.async {
            let alert = UIAlertController(title: title, message: msg, preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    }
}

Appelez maintenant directement comme ceci

self.showAlert(title: "Your title here...", msg: "Your message here...")

Méthode 7:

Alerte sans classe partagée avec Extension dans une classe distincte pour alerte.

Créez une nouvelle classe Swift et import UIKit. Copiez et collez le code ci-dessous.

//This is your Swift new class file
import UIKit
import Foundation

extension UIAlertController {
    class func alert(title:String, msg:String, target: UIViewController) {
        let alert = UIAlertController(title: title, message: msg, preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default) {
        (result: UIAlertAction) -> Void in
        })
        target.present(alert, animated: true, completion: nil)
    }
}

Appelez maintenant la fonction d'alerte comme celle-ci dans toutes vos classes (ligne unique).

UIAlertController.alert(title:"Title", msg:"Message", target: self)

Comment c'est....


Perfekt! +1 Pourriez-vous s'il vous plaît ajouter une méthode avec un délai d'expiration intégré? Merci!
PascalS

@ Passe, désolé de ne pas comprendre, pouvez-vous expliquer brièvement.
iOS

J'ai besoin d'un alertController qui est présenté jusqu'à ce que le bouton «OK» soit cliqué ou qu'un délai se soit produit. Quelque chose comme la méthode 6 ou 7 mais avec une variable d'entrée supplémentaire 'timeout'.
PascalS

extension UIViewController {func alertWithTime (title: String, msg: String, timeInterval: TimeInterval) {DispatchQueue.main.async {let alert = UIAlertController (title: title, message: msg, preferStyle: .alert) alert.addAction (UIAlertAction (title) : "OK", style: .default, gestionnaire: nil)) self.present (alerte, animé: vrai, achèvement: nul) si #available (iOS 10.0, *) {Timer.scheduledTimer (withTimeInterval: timeInterval, répète: false , block: {_ in alert.dismiss (animated: true, complétement: nil)})} else {// Fallback sur les versions antérieures}}}}
iOS

1
Si vous mentionnez timeInterval 0 dans ce cas si vous ne voulez pas fermer l'alerte, utilisez la condition if. if timeInterval != 0 { if #available(iOS 10.0, *) { Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: false, block: { _ in alert.dismiss(animated: true, completion: nil) }) } else { // Fallback on earlier versions } }
iOS

19

Clic de vue

@IBAction func testClick(sender: UIButton) {

  var uiAlert = UIAlertController(title: "Title", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
  self.presentViewController(uiAlert, animated: true, completion: nil)

  uiAlert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { action in
   println("Click of default button")
  }))

  uiAlert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { action in
   println("Click of cancel button")
  }))

}

Fait avec deux boutons OK et Annuler


12

Si vous ciblez iOS 7 et 8, vous avez besoin de quelque chose comme ça pour vous assurer que vous utilisez la bonne méthode pour chaque version, car elle UIAlertViewest déconseillée dans iOS 8, mais UIAlertControllern'est pas disponible dans iOS 7:

func alert(title: String, message: String) {
    if let getModernAlert: AnyClass = NSClassFromString("UIAlertController") { // iOS 8
        let myAlert: UIAlertController = UIAlertController(title: title, message: message, preferredStyle: .Alert)
        myAlert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
        self.presentViewController(myAlert, animated: true, completion: nil)
    } else { // iOS 7
        let alert: UIAlertView = UIAlertView()
        alert.delegate = self

        alert.title = title
        alert.message = message
        alert.addButtonWithTitle("OK")

        alert.show()
    }
}

Ou vous pouvez gagner du temps et l'utiliser UIAlertViewjusqu'à ce que vous supprimiez le support pour iOS 7. Apple ne rejettera pas votre application pour cela.
cprcrack

2
La dépréciation ne signifie pas «ne pas utiliser ceci» ou que ce serait la «mauvaise méthode», cela signifie simplement que cela ne fonctionnera pas plus tard. Il n'est pas nécessaire d'utiliser spécifiquement UIAlertController sur iOS8 si l'on a juste besoin d'alertes de base. Ils fonctionneront comme avant. De nombreuses API sont obsolètes dans iOS4 ou 5 et fonctionnent toujours dans iOS8. Mais bien sûr, les applications ciblant un niveau iOS supérieur ne devraient pas les utiliser et c'est pourquoi il y a un avertissement de dépréciation.
Sami Kuhmonen

1
@SamiKuhmonen Non, mais cela explique plus clairement pourquoi vous faites ce que vous faites et facilite la suppression de la prise en charge des méthodes obsolètes lorsque votre version minimale est suffisamment élevée pour le faire.
AstroCB du

12

Avec les extensions de protocole de Swift 2, vous pouvez créer un protocole qui fournit une implémentation par défaut à vos contrôleurs de vue:

ShowsAlert.swift

import UIKit

protocol ShowsAlert {}

extension ShowsAlert where Self: UIViewController {
    func showAlert(title: String = "Error", message: String) {
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert)
        alertController.addAction(UIAlertAction(title: "Ok", style: .Default, handler: nil))
        presentViewController(alertController, animated: true, completion: nil)
    }
}

ViewController.swift

class ViewController: UIViewController, ShowsAlert {
    override func viewDidLoad() {
        super.viewDidLoad()
        showAlert(message: "Hey there, I am an error message!")
    }
}

1
Marche parfaitement. Pour Swift3, remplacez «presentViewController» par «present».
Vincent

11

Afficher UIAlertView dans un langage rapide: -

Protocole UIAlertViewDelegate

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

Afficher UIAlertViewController dans un langage rapide: -

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)

11

Ne fournissez tout simplement pas otherButtonTitles dans le constructeur.

let alertView = UIAlertView(title: "Oops!", message: "Something
happened...", delegate: nil, cancelButtonTitle: "OK")

alertView.show()

Mais je suis d'accord avec Oscar, cette classe est déconseillée dans iOS 8, donc il n'y aura pas d'utilisation d'UIAlertView si vous utilisez une application iOS 8 uniquement. Sinon, le code ci-dessus fonctionnera.


9

J'ai trouvé celui-ci,

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

pas 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 expliquer cela.


Apparemment, UIAlertView est obsolète dans iOS 8 et nous utilisons maintenant UIAlertController avec un style préféré de UIAlertControllerStyleAlert.
BlueBear

6
Si vous exécutez une application qui doit être rétrocompatible avec iOS7.1 et que vous l'écrivez dans Swift, UIAlertController plantera l'appareil cible. Vous devez prendre en charge les UIAlertViews hérités pour iOS7.
Joe

Je pense que ce n'est pas Swift qui provoquerait un crash, mais plutôt le fait que l'UIAlertController n'est pas disponible avant iOS 8
Frédéric Adda

7

Pour SWIFT4 , je pense que l'extension UIViewControlleret la création d'un contrôle de confirmation réutilisable est la manière la plus élégante.

Vous pouvez étendre le UIViewControllercomme ci-dessous:

extension UIViewController {

func AskConfirmation (title:String, message:String, completion:@escaping (_ result:Bool) -> Void) {
    let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)
    self.present(alert, animated: true, completion: nil)

    alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: { action in
        completion(true)
    }))

    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { action in
        completion(false)
    }))
  }
}

Ensuite, vous pouvez l'utiliser à tout moment:

 AskConfirmation(title: "YOUR MESSAGE TITLE", message: "YOUR MESSAGE") { (result) in
        if result { //User has clicked on Ok

        } else { //User has clicked on Cancel

        }
    }

5
    class Preview: UIViewController , UIAlertViewDelegate
    {
        @IBAction func MoreBtnClicked(sender: AnyObject)
        {
            var moreAlert=UIAlertView(title: "Photo", message: "", delegate: self, cancelButtonTitle: "No Thanks!", otherButtonTitles: "Save Image", "Email", "Facebook", "Whatsapp" )
            moreAlert.show()
            moreAlert.tag=111;
        }

        func alertView(alertView: UIAlertView, didDismissWithButtonIndex buttonIndex: Int)
        {
            if alertView.tag==111
            {
                if buttonIndex==0
                {
                    println("No Thanks!")
                }
                else if buttonIndex==1
                {
                    println("Save Image")
                }
                else if buttonIndex == 2
                {
                    println("Email")
                }
                else if buttonIndex == 3
                {
                    println("Facebook")
                }
                else if buttonIndex == 4
                {
                    println("Whatsapp")
                }
            }
        }
    }

La simple écriture d'un bloc de code n'est pas très utile. Lorsque vous répondez à une question (en particulier une ancienne question avec plusieurs réponses, y compris une réponse acceptée), veuillez écrire plus qu'un morceau de code. Veuillez ajouter une explication de ce que fait votre code, comment il répond à la question et en quoi il est différent (ou meilleur) que les autres réponses.
AdrianHHH

5

J'ai une autre astuce. Supposons que vous ayez 5 classes où une alerte de déconnexion doit être appliquée. Essayez avec l'extension de classe rapide.

Fichier - Nouveau - Classe Swift - Nommez-le.

Ajoutez ce qui suit:

public extension UIViewController
{

    func makeLogOutAlert()
    {
        var refreshAlert = UIAlertController(title: "Log Out", message: "Are You Sure to Log Out ? ", preferredStyle: UIAlertControllerStyle.Alert)

        refreshAlert.addAction(UIAlertAction(title: "Confirm", style: .Default, handler: { (action: UIAlertAction!) in
            self.navigationController?.popToRootViewControllerAnimated(true)
        }))

        refreshAlert.addAction(UIAlertAction(title: "Cancel", style: .Default, handler: { (action: UIAlertAction!) in
            refreshAlert .dismissViewControllerAnimated(true, completion: nil)
        }))

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

Implémentez en utilisant: self.makeLogOutAlert (). J'espère que cela aide.


5

J'ai créé une classe singleton pour la rendre pratique à utiliser depuis n'importe où dans votre application: https://github.com/Swinny1989/Swift-Popups

Vous pouvez ensuite créer un popup avec plusieurs boutons comme celui-ci:

Popups.SharedInstance.ShowAlert(self, title: "Title goes here", message: "Messages goes here", buttons: ["button one" , "button two"]) { (buttonPressed) -> Void in
    if buttonPressed == "button one" { 
      //Code here
    } else if buttonPressed == "button two" {
        // Code here
    }
}

ou des popups avec un seul bouton comme celui-ci:

Popups.SharedInstance.ShowPopup("Title goes here", message: "Message goes here.")

Merci. J'y soumets un problème
djdance

1
Hé @ Swinny89 Merci beaucoup pour partager cette solution avec nous! Je suis resté coincé avec la fermeture et tu viens de me sauver!
Bruno Campos

5

Swift 3

Ce qui suit est un exemple simple de la façon de créer une alerte simple avec un bouton avec Swift 3.

let alert = UIAlertController(title: "Title",
                              message: "Message",
                              preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .default))
present(alert, animated: true)

Dans l'exemple ci-dessus, le rappel de poignée de l'action a été omis car le comportement par défaut d'une vue d'alerte avec un bouton doit disparaître lorsque vous cliquez sur le bouton.

Voici comment créer une autre action, qui pourrait être ajoutée à l'alerte avec "alert.addAction (action)". Les différents styles sont .default, .destructive et .cancel.

let action = UIAlertAction(title: "Ok", style: .default) { action in
    // Handle when button is clicked    
}

4

J'ai obtenu le UIAlertViewcode d'initialisation suivant pour compiler sans erreurs (je pense que la dernière partie variée est peut-être délicate). Mais je devais m'assurer que la classe self(que je transmets en tant que délégué) adoptait le UIAlertViewDelegateprotocole pour que les erreurs de compilation disparaissent:

let alertView = UIAlertView(
                  title: "My Title",
                  message: "My Message",
                  delegate: self,
                  cancelButtonTitle: "Cancel",
                  otherButtonTitles: "OK"
                )

Au fait, c'est l'erreur que j'obtenais (à partir de Xcode 6.4):

Impossible de trouver un initialiseur pour le type 'UIAlertView' qui accepte une liste d'arguments de type '(titre: chaîne, message: chaîne, délégué: MyViewController, cancelButtonTitle: chaîne, otherButtonTitles: chaîne)'

Comme d'autres l'ont mentionné, vous devez migrer vers UIAlertController si vous pouvez cibler iOS 8.x +. Pour prendre en charge iOS 7, utilisez le code ci-dessus (iOS 6 n'est pas pris en charge par Swift).


4
 let alertController = UIAlertController(title: "Select Photo", message: "Select atleast one photo", preferredStyle: .alert)
    let action1 = UIAlertAction(title: "From Photo", style: .default) { (action) in
        print("Default is pressed.....")
    }
    let action2 = UIAlertAction(title: "Cancel", style: .cancel) { (action) in
        print("Cancel is pressed......")
    }
    let action3 = UIAlertAction(title: "Click new", style: .default) { (action) in
        print("Destructive is pressed....")

    }
    alertController.addAction(action1)
    alertController.addAction(action2)
    alertController.addAction(action3)
    self.present(alertController, animated: true, completion: nil)

}

4

Vous pouvez utiliser cette extension simple avec n nombre de boutons et les actions associées swift4 et au-dessus

extension UIViewController {
    func popupAlert(title: String?, message: String?, actionTitles:[String?], actions:[((UIAlertAction) -> Void)?]) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        for (index, title) in actionTitles.enumerated() {
            let action = UIAlertAction(title: title, style: .default, handler: actions[index])
            alert.addAction(action)
        }
        self.present(alert, animated: true, completion: nil)
    }
}

vous pouvez l'utiliser comme,

self.popupAlert(title: "Message", message: "your message", actionTitles: ["first","second","third"], actions:[
            {action1 in
                //action for first btn click
            },
            {action2 in
                //action for second btn click
            },
            {action3 in
                //action for third btn click
            }, nil]) 

veuillez ne pas poster de réponses en double. Si vous souhaitez modifier votre réponse.
iOS

Excellente réponse. C'est ce dont j'ai besoin. Je vous remercie!
Gregory Wilson Pullyattu

3

La raison pour laquelle cela ne fonctionne pas car une valeur que vous avez transmise à la fonction n'est pas correcte. swift n'aime pas 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 facultatif dont son type n'a pas (?) À la fin. vous devez donc lui transmettre une valeur concrète.


3
@IBAction func Alert(sender: UIButton) {

    var alertView:UIAlertView = UIAlertView()
    alertView.title = "Alert!"
    alertView.message = "Message"
    alertView.delegate = self
    alertView.addButtonWithTitle("OK")

    alertView.show()

}

Essaye ça


3

Utilisez ce code pour afficher une vue d'alerte

  let alertController = UIAlertController(title: "Hello  Coders", message: "your alert message", preferredStyle: .Alert)
        let defaultAction = UIAlertAction(title: "Close Alert", style: .Default, handler: nil)
        alertController.addAction(defaultAction)

        presentViewController(alertController, animated: true, completion: nil)

Référence: Swift Show Alert utilisant UIAlertController


3

dans xcode 9

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

3

SWIFT 4: créez simplement une extension pour UIViewController comme suit:

extension  UIViewController {        
    func showSuccessAlert(withTitle title: String, andMessage message:String) {
        let alert = UIAlertController(title: title, message: message,
                                  preferredStyle: UIAlertController.Style.alert)
        alert.addAction(UIAlertAction(title: "OK".localized, style:
        UIAlertAction.Style.default, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }
}

Maintenant, dans votre ViewController, appelez directement la fonction ci-dessus comme si elles étaient fournies par UIViewController.

    yourViewController.showSuccessAlert(withTitle: 
      "YourTitle", andMessage: "YourCustomTitle")

Généralement, les réponses sont beaucoup plus utiles si elles incluent une explication de ce que le code est censé faire et pourquoi cela résout le problème sans en introduire d'autres. Merci d'avoir amélioré la valeur de référence de la réponse et de la rendre plus compréhensible!
Tim Diekmann

2

essaye ça. Mettez le code ci-dessous dans le bouton.

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

1

Voici un exemple amusant dans Swift:

private func presentRandomJoke() {
  if let randomJoke: String = jokesController.randomJoke() {
    let alertController: UIAlertController = UIAlertController(title:nil, message:randomJoke, preferredStyle: UIAlertControllerStyle.Alert)
    alertController.addAction(UIAlertAction(title:"Done", style:UIAlertActionStyle.Default, handler:nil))
    presentViewController(alertController, animated:true, completion:nil)
  }
}

1

Voici une fonction assez simple d'AlertView dans Swift:

class func globalAlertYesNo(msg: String) {
        let alertView = UNAlertView(title: "Title", message: msg)

        alertView.messageAlignment = NSTextAlignment.Center
        alertView.buttonAlignment  = UNButtonAlignment.Horizontal

        alertView.addButton("Yes", action: {

            print("Yes action")

        })

        alertView.addButton("No", action: {

            print("No action")

        })

        alertView.show()

    }

Vous devez passer le message sous forme de chaîne où vous utilisez cette fonction.


1

L'ancienne façon: UIAlertView

let alertView = UIAlertView(title: "Default Style", message: "A standard alert.", delegate: self, cancelButtonTitle: "Cancel", otherButtonTitles: "OK")
alertView.alertViewStyle = .Default
alertView.show()

// MARK: UIAlertViewDelegate

 func alertView(alertView: UIAlertView, clickedButtonAtIndex buttonIndex: Int) {
 switch buttonIndex {

    // ...
   }
  }

La nouvelle façon: UIAlertController

let alertController = UIAlertController(title: "Default Style", message: "A standard alert.", preferredStyle: .Alert)

let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (action) in
// ...
 }
 alertController.addAction(cancelAction)

 let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in
// ...
 }
 alertController.addAction(OKAction)
 self.presentViewController(alertController, animated: true) {
 // ...
}

1

sur IOS 9, 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.present(alert, animated: true, completion: nil)

1

// Classe générique pour UIAlertView

//MARK:- MODULES
import Foundation
import UIKit

//MARK:- CLASS
class Alert  : NSObject{

static let shared = Alert()

var okAction : AlertSuccess?
typealias AlertSuccess = (()->())?
var alert: UIAlertController?

/** show */
public func show(title : String?, message : String?, viewController : UIViewController?, okAction : AlertSuccess = nil) {

    let version : NSString = UIDevice.current.systemVersion as NSString
    if  version.doubleValue >= 8 {
        alert = UIAlertController(title: title, message: message, preferredStyle:.alert)
        alert?.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action: UIAlertAction) in

            if let okAction = okAction {
                okAction()
            }
        }))
        viewController?.present(alert ?? UIAlertController(), animated:true, completion:nil);
    }
}

/** showWithCancelAndOk */
public func showWithCancelAndOk(title : String, okTitle : String, cancelTitle : String, message : String, viewController : UIViewController?, okAction : AlertSuccess = nil, cancelAction : AlertSuccess = nil) {
    let version:NSString = UIDevice.current.systemVersion as NSString;

    if  version.doubleValue >= 8 {
        alert = UIAlertController(title: title, message: message, preferredStyle:.alert)

        alert?.addAction(UIAlertAction(title: cancelTitle, style: .default, handler: { (action: UIAlertAction) in

            if let cancelAction = cancelAction {
                cancelAction()
            }
        }))
        alert?.addAction(UIAlertAction(title: okTitle, style: .default, handler: { (action: UIAlertAction) in

            if let okAction = okAction {
                okAction()
            }
        }))
        viewController?.present(alert!, animated:true, completion:nil);
    }
}

/** showWithTimer */
public func showWithTimer(message : String?, viewController : UIViewController?) {

    let version : NSString = UIDevice.current.systemVersion as NSString
    if  version.doubleValue >= 8 {
        alert = UIAlertController(title: "", message: message, preferredStyle:.alert)
        viewController?.present(alert ?? UIAlertController(), animated:true, completion:nil)
        let when = DispatchTime.now() + 1
        DispatchQueue.main.asyncAfter(deadline: when){
            self.alert?.dismiss(animated: true, completion: nil)
        }
    }
}
}

Utilisation:-

Alert.shared.show(title: "No Internet Connection", message: "The internet connection appers to be offline.", viewController: self) //without ok action

Alert.shared.show(title: "No Internet Connection", message: "The internet connection appers to be offline.", viewController: self, okAction: {
                            //ok action
                        }) // with ok action

Alert.shared.show(title: "No Internet Connection", message: "The internet connection appers to be offline.", viewController: self, okAction: {
                            //ok action 
}, cancelAction: {
 //cancel action
}) //with cancel and ok action

Alert.shared.showWithTimer(message : "This is an alert with timer", viewController : self) //with timer

1
  // UIAlertView is deprecated. Use UIAlertController 
  // title = title of the alert view.
  // message = Alert message you want to show.
  // By tap on "OK" , Alert view will dismiss.

 UIAlertView(title: "Alert", message: "Enter Message here.", delegate: nil, cancelButtonTitle: "OK").show()

Pouvez-vous ajouter une explication au code que vous avez publié? Dans l'état actuel des choses, votre réponse n'est pas vraiment considérée comme une bonne réponse par les règles SO.
Nico Van Belle

la vue des alertes a changé dans swift 4. utilisez le contrôleur d'alerte
Sandeep Singh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.