Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从警报返回字符串时出错_Ios_Swift - Fatal编程技术网

Ios 从警报返回字符串时出错

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

我正在构建一个待办事项列表应用程序,从警报返回文本输入时遇到很多问题

这在单独的文件中,例如:“AddItem.swift”

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和它能做什么/如何做事情还很陌生,但我正在学习很多东西。再次感谢是的,我现在明白了。对斯威夫特来说还是个新手,但这些都是很好的学习经历。谢谢