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

How to implement a YesNo box as a ViewController method?

我想向我的 ViewController 添加一个方法,该方法显示一条带有文本的消息作为带有是和否按钮的警报。结果应为 Bool (Yes/No).

类型

我试过的是:

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。问题是 TextField 在 YesNoBox 关闭后永远不会获得焦点。当我在 Box 调用后使用 'becomeFirstResponder()' 时,应用程序冻结了。我不知道该怎么办?

使用补全

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 个完成(假设我们有一个函数可以上传图像并通知进度,完成后还有 1 个表示完成)

 func uploadImage(data: Data,progress:@escaping(Float) -> (),completion:@escaping(Bool) -> ()) {
    // implementation here
  }

打电话

self.uploadImage(someData) { progress in
   print(progress)
 }) { done in
   print(done)
 }

这可以通过完成处理程序来实现。

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