我简单地使用了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
答案 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。我不认为让所有按钮做同样的事情是你真正想要的。我可能错了。