web-dev-qa-db-fra.com

Où trouver une explication claire sur Swift alert (UIAlertController)?

Impossible de trouver une explication claire et informative pour cela.

19
Nikita Kurtin

Après avoir cherché pendant un moment sur un sujet, je n'ai pas trouvé une explication claire, même dans sa référence de classe Référence UIAlertController

C'est ok, mais pas assez clair pour moi.

Donc, après avoir récolté quelques pois, j'ai décidé de faire ma propre explication (J'espère que ça aide) 

Alors voilà:

  1. UIAlertView est obsolète comme indiqué: UIAlertView dans Swift
  2. UIAlertController devrait être utilisé dans iOS8 + Pour en créer un d'abord, nous devons l'instancier, le constructeur (init) obtient 3 paramètres: 

2.1 title: String -> texte en gros caractères gras à afficher en haut de la boîte de dialogue de l'alerte

Message 2.2: Chaîne -> Texte plus petit (explique à peu près tout soi-même)

2.3 prefferedStyle:UIAlertControllerStyle -> définir le style de la boîte de dialogue, dans la plupart des cas: UIAlertControllerStyle.Alert

  1. Maintenant, pour l'afficher à l'utilisateur, nous pouvons utiliser showViewController ou presentViewController et transmettre notre alerte en tant que paramètre

  2. Pour ajouter une interaction avec un utilisateur, nous pouvons utiliser:

4.1 UIAlertController.addAction pour créer des boutons

4.2 UIAlertController.addTextField pour créer des champs de texte

Edit note: exemples de code ci-dessous, mis à jour pour la syntaxe Swift 3

Exemple 1: Dialogue simple

@IBAction func alert1(sender: UIButton) {
     //simple alert dialog
    let alert=UIAlertController(title: "Alert 1", message: "One has won", preferredStyle: UIAlertControllerStyle.alert);
    //show it
    show(alert, sender: self);
}

Exemple 2: Dialogue avec une entrée textField & deux boutons

@IBAction func alert2(sender: UIButton) {
    //Dialog with one input textField & two buttons
    let alert=UIAlertController(title: "Alert 2", message: "Two will win too", preferredStyle: UIAlertControllerStyle.alert);
    //default input textField (no configuration...)
    alert.addTextField(configurationHandler: nil);
    //no event handler (just close dialog box)
    alert.addAction(UIAlertAction(title: "No", style: UIAlertActionStyle.cancel, handler: nil));
    //event handler with closure
    alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.default, handler: {(action:UIAlertAction) in
        let fields = alert.textFields!;
        print("Yes we can: "+fields[0].text!);
    }));
    present(alert, animated: true, completion: nil);
}

Exemple 3: un champ de saisie personnalisé et un bouton

@IBAction func alert3(sender: UIButton) {
   // one input & one button
   let alert=UIAlertController(title: "Alert 3", message: "Three will set me free", preferredStyle: UIAlertControllerStyle.alert);

    //configured input textField
    var field:UITextField?;// operator ? because it's been initialized later
    alert.addTextField(configurationHandler:{(input:UITextField)in
        input.placeholder="I am displayed, when there is no value ;-)";
        input.clearButtonMode=UITextFieldViewMode.whileEditing;
        field=input;//assign to outside variable(for later reference)
    });
    //alert3 yesHandler -> defined in the same scope with alert, and passed as event handler later
    func yesHandler(actionTarget: UIAlertAction){
        print("YES -> !!");
        //print text from 'field' which refer to relevant input now
        print(field!.text!);//operator ! because it's Optional here
    }
    //event handler with predefined function
    alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.default, handler: yesHandler));

    present(alert, animated: true, completion: nil);
 }

J'espère que ça aide, et bonne chance ;-)

63
Nikita Kurtin

Une instance de UIAlertController peut être présentée à l'écran de manière modale, comme n'importe quel autre UIViewController à l'aide de la méthode presentViewController: animated: completion:. Ce qui différencie l’instance d’UIAlertController du travail en tant que ActionSheet ou AlertView est le paramètre de style que vous transmettez lors de sa création.

Plus de délégation

Si vous avez utilisé UIActionSheet ou UIAlertView, vous savez que le moyen de l'obtenir est que la classe (dans la plupart des cas, ViewController) implémente le protocole UIActionSheetDelegate ou UIAlertViewDelegate. Certains projets open source ont remplacé ce modèle de délégation par des rappels basés sur des blocs, mais les API officielles n'ont jamais été mises à jour. UIAlertController n'utilise pas de délégation. Au lieu de cela, il a une collection d'éléments UIAlertAction, qui utilisent des fermetures (ou des blocs si vous utilisez Objective-C) pour gérer les entrées utilisateur.

Pour la fiche d'action

@IBAction func showActionSheet(sender: AnyObject) {
  //Create the AlertController
  let actionSheetController: UIAlertController = UIAlertController(title: "Action Sheet", message: "Swiftly Now! Choose an option!", preferredStyle: .ActionSheet)

  //Create and add the Cancel action
  let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
    //Just dismiss the action sheet
  }
  actionSheetController.addAction(cancelAction)
    //Create and add first option action
  let takePictureAction: UIAlertAction = UIAlertAction(title: "Take Picture", style: .Default) { action -> Void in
    //Code for launching the camera goes here
    }
  actionSheetController.addAction(takePictureAction)
  //Create and add a second option action
  let choosePictureAction: UIAlertAction = UIAlertAction(title: "Choose From Camera Roll", style: .Default) { action -> Void in
    //Code for picking from camera roll goes here
    }
  actionSheetController.addAction(choosePictureAction)

  //Present the AlertController
  self.presentViewController(actionSheetController, animated: true, completion: nil)
}

Pour AlertView avec un champ de texte

@IBAction func showAlert(sender: AnyObject) {
  //Create the AlertController
  let actionSheetController: UIAlertController = UIAlertController(title: "Alert", message: "Swiftly Now! Choose an option!", preferredStyle: .Alert)

  //Create and add the Cancel action
  let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
    //Do some stuff
    }
  actionSheetController.addAction(cancelAction)
    //Create and an option action
  let nextAction: UIAlertAction = UIAlertAction(title: "Next", style: .Default) { action -> Void in
    //Do some other stuff
    }
  actionSheetController.addAction(nextAction)
  //Add a text field
  actionSheetController.addTextFieldWithConfigurationHandler { textField -> Void in
       //TextField configuration
     textField.textColor = UIColor.blueColor()
   }

   //Present the AlertController
   self.presentViewController(actionSheetController, animated: true, completion: nil)
}
11
Omer Waqas Khan

Une partie de la syntaxe a changé depuis les réponses originales. Voici un exemple de code qui alerte l'utilisateur s'il n'est pas connecté à iCloud.

CKContainer.default().accountStatus { (accountStatus, error) in
        switch accountStatus {
        case .available:
            print("iCloud Available")
        case .noAccount:
            print("No iCloud account")
            //simple alert dialog
            let alert=UIAlertController(title: "Sign in to iCloud", message: "This application requires iClound. Sign in to your iCloud account to write records. On the Home screen, launch Settings, tap iCloud, and enter your Apple ID. Turn iCloud Drive on. If you don't have an iCloud account, tap Create a new Apple ID", preferredStyle: UIAlertControllerStyle.alert);
            //no event handler (just close dialog box)
            alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil));
            //show it
            self.present(alert, animated: true, completion: nil)
        case .restricted:
            print("iCloud restricted")
        case .couldNotDetermine:
            print("Unable to determine iCloud status")
        }
    }
1
CliffAnd