我想向我的ViewController添加一个方法,该方法使用“是”和“否”按钮显示带有文本的消息作为警报。结果应为Bool类型(是/否)。
我尝试过的是:
func YesNoBox(msg: String) -> Bool
{
var retVal = false
let alert = UIAlertController(title: "", message: msg, preferredStyle: .alert)
let action_yes = UIAlertAction(title: "Yes", style: .default, handler:
{ _ in NSLog("The \"Yes\" alert occured."); retVal = true })
let action_no = UIAlertAction(title: "No", style: .cancel, handler:
{ _ in NSLog("The \"No\" alert occured."); retVal = false })
alert.addAction(action_yes)
alert.addAction(action_no)
self.present(alert, animated: true, completion: nil)
return retVal
}
但是,retVal
的值始终为false
。如果我使用的是C / C ++,我想我可以使用指针解决此问题,但这是Swift(我对此很陌生)。
有人知道我该如何工作吗?
编辑:我的问题如下。在ViewController上,我有一个TextField。当我点击文本字段时,应用程序应询问用户是否要从剪贴板粘贴文本。如果是,请粘贴,否则请为TextField赋予焦点(即,使光标在其中闪烁)。我试图用'textFieldShouldBeginEditing'做到这一点,并在此方法中显示YesNoBox。问题在于,关闭YesNoBox后,TextField永远不会获得焦点。在Box调用后使用“ becomeFirstResponder()”时,该应用程序冻结。我不知道该怎么办?
答案 0 :(得分:1)
使用补全
func yesNoBox(msg: String,completion:@escaping(Bool) -> ())
{
let alert = UIAlertController(title: "", message: msg, preferredStyle: .alert)
let action_yes = UIAlertAction(title: "Yes", style: .default, handler:
{ _ in
NSLog("The \"Yes\" alert occured.");
completion(true)
})
let action_no = UIAlertAction(title: "No", style: .cancel, handler:
{ _ in
NSLog("The \"No\" alert occured.");
completion(false)
})
alert.addAction(action_yes)
alert.addAction(action_no)
self.present(alert, animated: true, completion: nil)
}
致电
yesNoBox(msg:"someMessage") { yes in
if yes {
// do yes action
}
else {
// do no action
}
}
2个回调:
此函数有2个补全(假设我们有一个上传图像并通过补全通知进度的函数,还有一个说完成了)
func uploadImage(data: Data,progress:@escaping(Float) -> (),completion:@escaping(Bool) -> ()) {
// implementation here
}
打电话
self.uploadImage(someData) { progress in
print(progress)
}) { done in
print(done)
}
答案 1 :(得分:1)
这可以通过完成处理程序来实现。
func showAlertWithOptions(title: String, message: String, completionHandler: @escaping (Bool) -> Void) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
let action_yes = UIAlertAction(title: "Yes", style: .default, handler: { _ in
completionHandler(true)
})
let action_no = UIAlertAction(title: "No", style: .cancel, handler: { _ in
completionHandler(false)
})
alert.addAction(action_yes)
alert.addAction(action_no)
self.present(alert, animated: true, completion: nil)
}
现在调用该函数,并根据选择的动作添加要执行的其他任何功能或动作。
showAlertWithOptions(title: "Any title", message: "Any message") { success in
if success {
NSLog("The \"Yes\" alert occured.")
} else {
NSLog("The \"No\" alert occured.")
}
}