Ios 从警报返回字符串时出错
我正在构建一个待办事项列表应用程序,从警报返回文本输入时遇到很多问题 这在单独的文件中,例如:“AddItem.swift”Ios 从警报返回字符串时出错,ios,swift,Ios,Swift,我正在构建一个待办事项列表应用程序,从警报返回文本输入时遇到很多问题 这在单独的文件中,例如:“AddItem.swift” func showAddItemDialog(view: UIViewController) -> String { var textOfTask = UITextField() var textValue = "" let diag = UIAlertController(title: "Add Task", message: "Ente
func showAddItemDialog(view: UIViewController) -> String {
var textOfTask = UITextField()
var textValue = ""
let diag = UIAlertController(title: "Add Task", message: "Enter a task name", preferredStyle: .Alert)
diag.addTextFieldWithConfigurationHandler({ (textField) -> Void in })
diag.addAction(UIAlertAction(title: "Add", style: .Default, handler: { (action) -> Void in
textOfTask = diag.textFields![0] as UITextField
textValue = textOfTask.text!
addListItem(textValue)
}))
diag.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { (action: UIAlertAction!) in }))
view.presentViewController(diag, animated: true, completion: nil)
print("returning " + textValue)
return textValue
}
我正在尝试将警报文本框的文本值(“textValue”)返回给调用者
我已经尝试了很多方法,但是没有找到任何方法,上面的方法没有返回任何结果,因为函数在返回之前不会停止并等待警报显示。我想避免将此代码放入ViewController文件中,因为我读到这是一种不好的做法,但我真的无法理解这一点
如果有人有任何想法,请告诉我!谢谢
编辑:
我使用以下命令调用此函数:
@IBAction func didPressAdd(sender: AnyObject) {
showAddItemDialog(self)
}
正如@nhgrif在他的评论中所说,您不能返回函数结果的值。该函数在将警报交给系统显示后,甚至在警报被绘制到屏幕之前,立即返回 这是初学者在处理异步方法时经常犯的错误 您需要重构
showAddItemDialog
函数,以使用字符串参数进行完成闭包。在add操作的闭包中,从警报字段中获取文本,然后调用传递给您的闭包,并为其提供字符串
然后,当您调用
showAddItemDialog
函数时,向其传递一个闭包,该闭包对从用户处收集的文本执行任何操作。代码不会等待用户输入数据并单击“确定”按钮,这是正确的。答案是使用完成处理程序
// This is a slightly modified version of your code
func showAddItemDialog(view: UIViewController, completion: (text: String?) -> Void ) {
var textOfTask = UITextField()
var textValue = ""
let diag = UIAlertController(title: "Add Task", message: "Enter a task name", preferredStyle: .Alert)
diag.addTextFieldWithConfigurationHandler({ (textField) -> Void in })
diag.addAction(UIAlertAction(title: "Add", style: .Default, handler: { (action) -> Void in
textOfTask = diag.textFields![0] as UITextField
textValue = textOfTask.text!
addListItem(textValue)
completion(text: textValue)
}))
diag.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { (action: UIAlertAction!) in
completion(text: nil)
}))
view.presentViewController(diag, animated: true, completion: nil)
}
// In the view controller
@IBAction func didPressAdd(sender: AnyObject) {
// Call it like this:
showAddItemDialog(self) {
(text) in
// handle the result value here
if let textUserEntered = text {
// User entered some text and pressed OK
}
else {
// User pressed cancel
}
}
}
此方法在显示视图控制器后立即返回。这是在您创建的操作被点击之前。你必须找到另一种方法来做你想做的事情。addListItem(textValue)做什么?@nhgrif是的,这是我的问题。我似乎想不出另一种方法来实现它。@ryantxr将文本框文本保存到Firebase。您可以发布如何调用此函数吗?太棒了,非常感谢!我对swift和它能做什么/如何做事情还很陌生,但我正在学习很多东西。再次感谢是的,我现在明白了。对斯威夫特来说还是个新手,但这些都是很好的学习经历。谢谢