UIAlertAction的编写处理程序


103

我向UIAlertView用户展示了一个,但我不知道如何编写处理程序。这是我的尝试:

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

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

我在Xcode中遇到很多问题。

该文件说 convenience init(title title: String!, style style: UIAlertActionStyle, handler handler: ((UIAlertAction!) -> Void)!)

目前,整个块/封盖都让我有些头疼。任何建议都非常感谢。

Answers:


164

而不是将自己放在处理程序中,而应放置(提示:UIAlertAction!)。这应该使您的代码看起来像这样

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

这是在Swift中定义处理程序的正确方法。

正如Brian在下面指出的那样,还有更简单的方法来定义这些处理程序。书中讨论了使用他的方法的情况,请查看标题为“闭包”的部分


9
{alert in println("Foo")}{_ in println("Foo")}{println("Foo")}也应该起作用。
Brian Nickel

7
@BrianNickel:第三个无效,因为您需要处理参数操作。但是除此之外,您不必快速编写UIAlertActionStyle.Default。.default也可以。
2014年

请注意,如果您使用的是“让富= UIAlertAction(...),那么你可以使用尾随闭包语法把可能是什么UIAlertAction经过长时间的封闭-它看起来相当不错的方式。
David H制作

1
这是一种优雅的书写方式:alert.addAction(UIAlertAction(title: "Okay", style: .default) { _ in println("Foo") })
哈里斯

74

函数是Swift中的一流对象。因此,如果您不想使用闭包,也可以只定义具有适当签名的函数,然后将其作为handler参数传递。观察:

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

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

在Objective-C中应该如何看待该处理函数?
andilabs 2015年

1
函数 Swift 中的闭包:)我虽然很酷。退房的文档:developer.apple.com/library/ios/documentation/Swift/Conceptual/...
kakubei

16

您可以使用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")
 }))

以上所有答案都是正确的,我只是在显示另一种可以完成的方法。


11

让我们假设您想要一个带有主标题的UIAlertAction,两个动作(保存和放弃)和取消按钮:

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)

这适用于swift 2(Xcode 7.0 beta 3)


7

Swift 3.0中的语法更改

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

7

在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

这是我用xcode 7.3.1做到的

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

//创建按钮

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

//将按钮添加到警报控件

myAlert.addAction(sayhi);

//整个代码,此代码将添加2个按钮

  @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

创建警报,在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)

和功能

func finishAlert(alert: UIAlertAction!)
{
}

2
  1. 在斯威夫特

    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. 在目标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];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.