Gestore di scrittura per UIAlertAction


104

Sto presentando un UIAlertViewall'utente e non riesco a capire come scrivere il gestore. Questo è il mio tentativo:

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

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

Ho un sacco di problemi con Xcode.

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

L'intero blocco / chiusura è un po 'sopra la mia testa al momento. Ogni suggerimento è molto apprezzato.

Risposte:


165

Invece di self nel tuo gestore, metti (alert: UIAlertAction!). Questo dovrebbe rendere il tuo codice simile a questo

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

questo è il modo corretto per definire i gestori in Swift.

Come Brian ha sottolineato di seguito, ci sono anche modi più semplici per definire questi gestori. L'uso dei suoi metodi è discusso nel libro, guarda la sezione intitolata Chiusure


9
{alert in println("Foo")}, {_ in println("Foo")}e {println("Foo")}dovrebbero funzionare anche.
Brian Nickel

7
@BrianNickel: il terzo non funziona perché devi gestire l'azione dell'argomento. Ma oltre a ciò non è necessario scrivere UIAlertActionStyle.Default in swift. Anche l'impostazione predefinita funziona.
Ben

Nota che se usi un "let foo = UIAlertAction (...), puoi usare la sintassi di chiusura finale per mettere quella che potrebbe essere una chiusura lunga dopo UIAlertAction - sembra piuttosto carino in questo modo.
David H

1
Ecco un modo elegante per scrivere questo:alert.addAction(UIAlertAction(title: "Okay", style: .default) { _ in println("Foo") })
Harris

74

Le funzioni sono oggetti di prima classe in Swift. Quindi, se non vuoi usare una chiusura, puoi anche definire una funzione con la firma appropriata e poi passarla come handlerargomento. Osservare:

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

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

come dovrebbe apparire questa funzione di gestore nell'obiettivo-C?
andilabs

1
Le funzioni sono chiusure in Swift :) che pensavo fosse piuttosto interessante. Guarda i documenti: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
kakubei

17

Puoi farlo in modo semplice usando 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")
 }))

Tutte le risposte di cui sopra sono corrette, sto solo mostrando un altro modo che può essere fatto.


11

Supponiamo che tu voglia un UIAlertAction con titolo principale, due azioni (salva e scarta) e pulsante Annulla:

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)

Funziona con swift 2 (versione Xcode 7.0 beta 3)


7

Modifica della sintassi in swift 3.0

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

7

In 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

questo è come lo faccio con xcode 7.3.1

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

// crea il pulsante

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

// aggiunta del pulsante al controllo degli avvisi

myAlert.addAction(sayhi);

// l'intero codice, questo codice aggiungerà 2 pulsanti

  @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

crea un avviso, testato in 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)

e la funzione

func finishAlert(alert: UIAlertAction!)
{
}

2
  1. In 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. Nell'obiettivo 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];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.