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.

Steve Marshall
la source

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

jbman223
la source
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))
Rob Johansen
la source
à 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.

Korpel
la source
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)

polarware
la source
7

Changement de syntaxe dans Swift 3.0

alert.addAction(UIAlertAction(title: "Okay",
                style: .default,
                handler: { _ in print("Foo") } ))
Fangming
la source
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)
mohamad taghadosi
la source
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")
    }
Alan
la source
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!)
{
}
luhuiya
la source
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];
Technologie Silversky
la source