UIAlertViewController的异常行为

时间:2017-05-11 16:11:50

标签: swift3 uialertcontroller

我简单地使用了UIAlertViewController,其中我将按钮标签和动作函数作为参数传递给名为showAlert()的函数,该函数设置并调用警报。我在in闭包中的UIAlertAction中有动作功能。

异常行为:一旦执行showAlert而不是按下按钮,动作函数就会执行。

另一个问题是,当按下按钮时,警报会自动被解除。我没有解雇声明。

    class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    func test1() {
        NSLog("test 1 executed")
    }




    @IBAction func show(_ sender: UIButton) {
        self.showAlert(title: "Title", message: "Message",titleString: "A,B,C", function:test1())
    }
    func showAlert(title: String, message: String, titleString: String, function: ()) {
        let cancelButtonTitle = NSLocalizedString("Cancel", comment: "")
        let labels = titleString.components(separatedBy: ",")
        var actions = [UIAlertAction()]
        for label in labels {
            let a = UIAlertAction(title: label, style: .default) { action in
                function // executed as soon as showAlert is called!! 
                         // Expecting to be called when button is pressed
                NSLog("\(label) Pressed")

            }
            actions.append(a)
        }

        let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)

        // Create the actions.
        let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { action in
            NSLog("Cancel Button pressed.")
        }
        for action in actions {
            alertController.addAction(action)
        }
        // Add the actions.
        alertController.addAction(cancelAction)

        present(alertController, animated: true, completion: nil)
    }

}

控制台上的响应是: 2017-05-11 11:55:15.593 AlertTest [5304:8818290]执行功能 2017-05-11 11:55:25.287 AlertTest [5304:8818290] A Pressed

1 个答案:

答案 0 :(得分:1)

记住这一点:

  

将()添加到方法/函数名称的末尾将调用该方法。删除()以“引用”该方法/函数。

当你这样做时:

//                                                                           I mean this
//                                                                                 |
//                                                                                 v 
self.showAlert(title: "Title", message: "Message",titleString: "A,B,C", function:test1())

您正在调用test并使用其返回值作为showAlert的参数。

当达到该行时,首先调用test()来评估其返回值,然后调用showAlert,因此控制台输出。

要引用方法test,请删除()

self.showAlert(title: "Title", message: "Message",titleString: "A,B,C", function:test1)

您还写错了参数类型。不带参数且什么都不返回的函数类型应为() -> Void

func showAlert(title: String, message: String, 
    titleString: String, function: () -> Void) {

此外,在警报闭包中,将()添加到函数中,因为您现在正在尝试调用它:

let a = UIAlertAction(title: label, style: .default) { action in
    function() // Note the ()s
    NSLog("\(label) Pressed")

}

P.S。我不认为让所有按钮做同样的事情是你真正想要的。我可能错了。