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.

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


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))

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.


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)


7

Perubahan sintaks di swift 3.0

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

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)

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")
    }

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!)
{
}

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];
    
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.