如何实现YesNo框作为ViewController方法?

时间:2019-05-15 20:23:46

标签: ios swift uialertaction

我想向我的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()”时,该应用程序冻结。我不知道该怎么办?

2 个答案:

答案 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.")
    }
}