Trình xử lý viết cho UIAlertAction


104

Tôi đang trình bày một trình UIAlertViewxử lý cho người dùng và tôi không thể tìm ra cách viết trình xử lý. Đây là nỗ lực của tôi:

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

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

Tôi gặp một loạt các vấn đề trong Xcode.

Tài liệu cho biết convenience init(title title: String!, style style: UIAlertActionStyle, handler handler: ((UIAlertAction!) -> Void)!)

Toàn bộ khối / đóng cửa hiện tại hơi quá đầu của tôi. Bất kỳ đề nghị được đánh giá cao.

Câu trả lời:


165

Thay vì tự trong trình xử lý của bạn, hãy đặt (cảnh báo: UIAlertAction!). Điều này sẽ làm cho mã của bạn trông như thế này

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

đây là cách thích hợp để xác định trình xử lý trong Swift.

Như Brian đã chỉ ra bên dưới, cũng có nhiều cách dễ dàng hơn để xác định các trình xử lý này. Sử dụng các phương pháp của ông ấy được thảo luận trong cuốn sách, hãy xem phần có tiêu đề Closures


9
{alert in println("Foo")}, {_ in println("Foo")}{println("Foo")}cũng sẽ hoạt động.
Brian Nickel

7
@BrianNickel: Cái thứ 3 không hoạt động vì bạn cần xử lý hành động đối số. Nhưng thêm vào đó, bạn không cần phải viết UIAlertActionStyle.Default nhanh chóng. .Default cũng hoạt động.
Ben

Lưu ý rằng nếu bạn sử dụng "let foo = UIAlertAction (...), thì bạn có thể sử dụng cú pháp đóng theo sau để đặt những gì có thể là một đóng dài sau UIAlertAction - nó trông khá đẹp theo cách đó.
David H

1
Đây là một cách thanh lịch để viết điều này:alert.addAction(UIAlertAction(title: "Okay", style: .default) { _ in println("Foo") })
Harris

74

Các hàm là các đối tượng hạng nhất trong Swift. Vì vậy, nếu bạn không muốn sử dụng một bao đóng, bạn cũng có thể chỉ cần xác định một hàm với chữ ký thích hợp và sau đó chuyển nó làm handlerđối số. Quan sát:

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

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

làm thế nào nên nhìn vào hàm xử lý này trong mục tiêu-C?
andilabs

1
Các hàm được đóng lại trong Swift :) mà tôi mặc dù khá tuyệt. Kiểm tra tài liệu: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
kakubei

17

Bạn có thể làm điều đó đơn giản như sau bằng cách sử dụng 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")
 }))

Tất cả các câu trả lời trên đều đúng, tôi chỉ đang chỉ ra một cách khác có thể được thực hiện.


11

Giả sử rằng bạn muốn một UIAlertAction với tiêu đề chính, hai hành động (lưu và hủy) và nút hủy:

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)

Điều này hoạt động cho swift 2 (Phiên bản Xcode 7.0 beta 3)


7

Thay đổi cú pháp trong nhanh chóng 3.0

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

7

Trong 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

đây là cách tôi làm điều đó với xcode 7.3.1

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

// tạo nút

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

// thêm nút vào điều khiển cảnh báo

myAlert.addAction(sayhi);

// toàn bộ mã, mã này sẽ thêm 2 nút

  @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

tạo cảnh báo, được kiểm tra trong 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)

và chức năng

func finishAlert(alert: UIAlertAction!)
{
}

2
  1. Trong 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. Trong Mục tiêu 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];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.