Penulisan handler untuk UIAlertAction

104

Saya sedang mempresentasikan UIAlertViewkepada pengguna dan saya tidak tahu bagaimana menulis handler. Ini adalah usaha saya:

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

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

Saya mendapatkan banyak masalah di Xcode.

Dokumentasinya mengatakan convenience init(title title: String!, style style: UIAlertActionStyle, handler handler: ((UIAlertAction!) -> Void)!)

Seluruh blok / penutupan sedikit di atas kepala saya saat ini. Setiap saran sangat dihargai.

Steve Marshall
sumber

Jawaban:

165

Alih-alih mandiri di pawang Anda, letakkan (alert: UIAlertAction!). Ini akan membuat kode Anda terlihat seperti ini

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

ini adalah cara yang tepat untuk mendefinisikan penangan di Swift.

Seperti yang ditunjukkan Brian di bawah ini, ada juga cara yang lebih mudah untuk menentukan penangan ini. Menggunakan metodenya yang dibahas dalam buku ini, lihat bagian berjudul Penutupan

jbman223
sumber
9
{alert in println("Foo")},, {_ in println("Foo")}dan {println("Foo")}juga harus berfungsi.
Brian Nickel
7
@BrianNickel: Yang ketiga tidak berfungsi karena Anda perlu menangani aksi argumen. Tetapi selain itu Anda tidak perlu menulis UIAlertActionStyle.Default dengan cepat. .Default berfungsi juga.
Ben
Perhatikan bahwa jika Anda menggunakan "let foo = UIAlertAction (...), maka Anda dapat menggunakan sintaks penutup trailing untuk meletakkan apa yang mungkin merupakan penutupan panjang setelah UIAlertAction - tampilannya cukup bagus.
David H
1
Berikut cara yang elegan untuk menulis ini:alert.addAction(UIAlertAction(title: "Okay", style: .default) { _ in println("Foo") })
Harris
74

Fungsi adalah objek kelas satu di Swift. Jadi jika Anda tidak ingin menggunakan closure, Anda juga bisa mendefinisikan fungsi dengan tanda tangan yang sesuai lalu meneruskannya sebagai handlerargumen. Mengamati:

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

alert.addAction(UIAlertAction(title: "Okay",
                              style: UIAlertActionStyle.Default,
                              handler: someHandler))
Rob Johansen
sumber
bagaimana seharusnya melihat fungsi penangan ini di objektif-C?
andilabs
1
Fungsinya adalah closure di Swift :) yang menurut saya cukup keren. Lihat
dokumennya
17

Anda dapat melakukannya sesederhana ini menggunakan 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")
 }))

Semua jawaban di atas benar, saya hanya menunjukkan cara lain yang bisa dilakukan.

Korpel
sumber
11

Mari kita asumsikan bahwa Anda menginginkan UIAlertAction dengan judul utama, dua tindakan (simpan dan buang) dan tombol batal:

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)

Ini berfungsi untuk swift 2 (Xcode Version 7.0 beta 3)

polarware
sumber
7

Perubahan sintaks di swift 3.0

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

Di 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
sumber
4

ini adalah bagaimana saya melakukannya dengan xcode 7.3.1

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

// buat tombol

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

// menambahkan tombol ke kontrol peringatan

myAlert.addAction(sayhi);

// seluruh kode, kode ini akan menambahkan 2 tombol

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

buat peringatan, diuji di 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)

dan fungsinya

func finishAlert(alert: UIAlertAction!)
{
}
luhuiya
sumber
2
  1. Di 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. Dalam Tujuan 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];
    
Teknologi Silversky
sumber