Gestionnaire d'écriture pour UIAlertAction


104

Je présente un UIAlertViewà l'utilisateur et je n'arrive pas à comprendre comment écrire le gestionnaire. Voici ma tentative:

let alert = UIAlertController(title: "Title",
                            message: "Message",
                     preferredStyle: UIAlertControllerStyle.Alert)

alert.addAction(UIAlertAction(title: "Okay",
                              style: UIAlertActionStyle.Default,
                            handler: {self in println("Foo")})

Je reçois un tas de problèmes dans Xcode.

La documentation dit convenience init(title title: String!, style style: UIAlertActionStyle, handler handler: ((UIAlertAction!) -> Void)!)

L'ensemble des blocs / fermetures est un peu au-dessus de ma tête pour le moment. Toute suggestion est très appréciée.

Réponses:


165

Au lieu de self dans votre gestionnaire, mettez (alert: UIAlertAction!). Cela devrait donner à votre code l'apparence suivante

    alert.addAction(UIAlertAction(title: "Okay",
                          style: UIAlertActionStyle.Default,
                        handler: {(alert: UIAlertAction!) in println("Foo")}))

c'est la bonne façon de définir les gestionnaires dans Swift.

Comme Brian l'a souligné ci-dessous, il existe également des moyens plus simples de définir ces gestionnaires. L'utilisation de ses méthodes est discutée dans le livre, regardez la section intitulée Fermetures


9
{alert in println("Foo")}, {_ in println("Foo")}et {println("Foo")}devrait également fonctionner.
Brian Nickel

7
@BrianNickel: Le 3ème ne fonctionne pas car vous devez gérer l'action d'argument. Mais en plus de cela, vous n'avez pas besoin d'écrire UIAlertActionStyle.Default dans swift. .Default fonctionne aussi.
Ben

Notez que si vous utilisez un "let foo = UIAlertAction (...), alors vous pouvez utiliser la syntaxe de fermeture de fin pour mettre ce qui pourrait être une longue fermeture après UIAlertAction - ça a l'air plutôt bien comme ça.
David H

1
Voici une manière élégante d'écrire ceci:alert.addAction(UIAlertAction(title: "Okay", style: .default) { _ in println("Foo") })
Harris

74

Les fonctions sont des objets de première classe dans Swift. Donc, si vous ne voulez pas utiliser de fermeture, vous pouvez également simplement définir une fonction avec la signature appropriée, puis la passer comme handlerargument. Observer:

func someHandler(alert: UIAlertAction!) {
    // Do something...
}

alert.addAction(UIAlertAction(title: "Okay",
                              style: UIAlertActionStyle.Default,
                              handler: someHandler))

à quoi devrait ressembler cette fonction de gestionnaire dans objective-C?
andilabs

1
Les fonctions sont des fermetures dans Swift :) ce qui, à mon avis, était plutôt cool. Consultez la documentation: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
kakubei

17

Vous pouvez le faire aussi simplement que cela en utilisant swift 2:

let alertController = UIAlertController(title: "iOScreator", message:
        "Hello, world!", preferredStyle: UIAlertControllerStyle.Alert)
alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Destructive,handler: { action in
        self.pressed()
}))

func pressed()
{
    print("you pressed")
}

    **or**


let alertController = UIAlertController(title: "iOScreator", message:
        "Hello, world!", preferredStyle: UIAlertControllerStyle.Alert)
alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Destructive,handler: { action in
      print("pressed")
 }))

Toutes les réponses ci-dessus sont correctes, je montre simplement une autre façon de faire.


11

Supposons que vous vouliez une UIAlertAction avec le titre principal, deux actions (enregistrer et supprimer) et un bouton d'annulation:

let actionSheetController = UIAlertController (title: "My Action Title", message: "", preferredStyle: UIAlertControllerStyle.ActionSheet)

    //Add Cancel-Action
    actionSheetController.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil))

    //Add Save-Action
    actionSheetController.addAction(UIAlertAction(title: "Save", style: UIAlertActionStyle.Default, handler: { (actionSheetController) -> Void in
        print("handle Save action...")
    }))

    //Add Discard-Action
    actionSheetController.addAction(UIAlertAction(title: "Discard", style: UIAlertActionStyle.Default, handler: { (actionSheetController) -> Void in
        print("handle Discard action ...")
    }))

    //present actionSheetController
    presentViewController(actionSheetController, animated: true, completion: nil)

Cela fonctionne pour Swift 2 (Xcode Version 7.0 beta 3)


7

Changement de syntaxe dans Swift 3.0

alert.addAction(UIAlertAction(title: "Okay",
                style: .default,
                handler: { _ in print("Foo") } ))

7

Dans Swift 4:

let alert=UIAlertController(title:"someAlert", message: "someMessage", preferredStyle:UIAlertControllerStyle.alert )

alert.addAction(UIAlertAction(title: "ok", style: UIAlertActionStyle.default, handler: {
        _ in print("FOO ")
}))

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

4

voici comment je le fais avec xcode 7.3.1

// create function
func sayhi(){
  print("hello")
}

// créer le bouton

let sayinghi = UIAlertAction(title: "More", style: UIAlertActionStyle.Default, handler:  { action in
            self.sayhi()})

// ajout du bouton au contrôle d'alerte

myAlert.addAction(sayhi);

// tout le code, ce code ajoutera 2 boutons

  @IBAction func sayhi(sender: AnyObject) {
        let myAlert = UIAlertController(title: "Alert", message:"sup", preferredStyle: UIAlertControllerStyle.Alert);
        let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler:nil)

        let sayhi = UIAlertAction(title: "say hi", style: UIAlertActionStyle.Default, handler:  { action in
            self.sayhi()})

        // this action can add to more button
        myAlert.addAction(okAction);
        myAlert.addAction(sayhi);

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

    func sayhi(){
        // move to tabbarcontroller
     print("hello")
    }

4

créer une alerte, testé dans xcode 9

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

et la fonction

func finishAlert(alert: UIAlertAction!)
{
}

2
  1. Dans Swift

    let alertController = UIAlertController(title:"Title", message: "Message", preferredStyle:.alert)
    
    let Action = UIAlertAction.init(title: "Ok", style: .default) { (UIAlertAction) in
        // Write Your code Here
    }
    
    alertController.addAction(Action)
    self.present(alertController, animated: true, completion: nil)
  2. Dans l'objectif C

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"Message" preferredStyle:UIAlertControllerStyleAlert];
    
    UIAlertAction *OK = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action)
    {
    }];
    
    [alertController addAction:OK];
    
    [self presentViewController:alertController animated:YES completion:nil];
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.