Handler für UIAlertAction schreiben

103

Ich präsentiere UIAlertViewdem Benutzer ein und kann nicht herausfinden, wie der Handler geschrieben wird. Das ist mein Versuch:

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

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

Ich habe eine Reihe von Problemen mit Xcode.

Die Dokumentation sagt convenience init(title title: String!, style style: UIAlertActionStyle, handler handler: ((UIAlertAction!) -> Void)!)

Die ganzen Blöcke / Verschlüsse sind im Moment etwas über meinem Kopf. Jeder Vorschlag wird sehr geschätzt.

Steve Marshall
quelle

Antworten:

164

Setzen Sie anstelle von sich selbst in Ihren Handler (Warnung: UIAlertAction!). Dadurch sollte Ihr Code so aussehen

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

Dies ist der richtige Weg, um Handler in Swift zu definieren.

Wie Brian weiter unten ausführte, gibt es auch einfachere Möglichkeiten, diese Handler zu definieren. Die Verwendung seiner Methoden wird im Buch beschrieben. Lesen Sie dazu den Abschnitt mit dem Titel Closures

jbman223
quelle
9
{alert in println("Foo")},, {_ in println("Foo")}und {println("Foo")}sollte auch funktionieren.
Brian Nickel
7
@BrianNickel: Der dritte funktioniert nicht, weil Sie die Argumentaktion verarbeiten müssen. Darüber hinaus müssen Sie UIAlertActionStyle.Default nicht schnell schreiben. Standard funktioniert auch.
Ben
Beachten Sie, dass Sie, wenn Sie "let foo = UIAlertAction (...)" verwenden, die nachfolgende Abschlusssyntax verwenden können, um einen möglicherweise langen Abschluss nach der UIAlertAction zu setzen - so sieht es ziemlich gut aus.
David H
1
Hier ist eine elegante Art, dies zu schreiben:alert.addAction(UIAlertAction(title: "Okay", style: .default) { _ in println("Foo") })
Harris
74

Funktionen sind in Swift erstklassige Objekte. Wenn Sie also keinen Abschluss verwenden möchten, können Sie auch einfach eine Funktion mit der entsprechenden Signatur definieren und diese dann als handlerArgument übergeben. Beobachten:

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

alert.addAction(UIAlertAction(title: "Okay",
                              style: UIAlertActionStyle.Default,
                              handler: someHandler))
Rob Johansen
quelle
Wie sollte diese Handlerfunktion in Ziel C aussehen?
Andilabs
1
Funktionen sind Schließungen in Swift :) was ich allerdings ziemlich cool fand. Schauen Sie sich die Dokumente an: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
kakubei
16

So einfach geht das mit 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")
 }))

Alle obigen Antworten sind richtig. Ich zeige nur einen anderen Weg, der getan werden kann.

Korpel
quelle
11

Nehmen wir an, Sie möchten eine UIAlertAction mit Haupttitel, zwei Aktionen (Speichern und Verwerfen) und der Schaltfläche Abbrechen:

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)

Dies funktioniert für Swift 2 (Xcode Version 7.0 Beta 3)

Polarware
quelle
7

Syntaxänderung in Swift 3.0

alert.addAction(UIAlertAction(title: "Okay",
                style: .default,
                handler: { _ in print("Foo") } ))
Fangming
quelle
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)
mohamad taghadosi
quelle
4

So mache ich es mit xcode 7.3.1

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

// Schaltfläche erstellen

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

// Hinzufügen der Schaltfläche zur Alarmsteuerung

myAlert.addAction(sayhi);

// Der gesamte Code, dieser Code fügt 2 Schaltflächen hinzu

  @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
quelle
4

Alert erstellen, getestet 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)

und die Funktion

func finishAlert(alert: UIAlertAction!)
{
}
luhuiya
quelle
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. In Ziel 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];
Silversky-Technologie
quelle