使用UIAlertController时键盘滞后

时间:2016-03-29 23:47:28

标签: ios swift keyboard uialertview

我有一个侧面项目应用程序,它使用带有文本框的UIAlertController来获取用户的输入。我的问题是,当用户输入文本并按“添加”时,键盘会在解除之前保持打开状态1-3秒。但是,如果用户按下返回键并在键盘上的文本框中输入文本,则不会发生这种情况。我原本以为是使用完成处理程序并且必须等待它完成,但由于使用返​​回键工作正常,我认为不是这样。

这是我显示提醒的地方:

func addItem(view: UIViewController, completion: (text: String?) -> Void) {

    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
        let textOfTask = diag.textFields![0] as UITextField
        let textValue = textOfTask.text!

        if textValue.characters.count > 0 {
            completion(text: textValue)
        }
    }))
    diag.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { (action: UIAlertAction!) in
    completion(text: nil)
    }))
    view.presentViewController(diag, animated: true, completion: nil)
}

我如何调用此函数:

@IBAction func didPressAdd(sender: AnyObject) {
    addItem(self) {
        (text) in
        if let itemText = text {
            // Check if has all the datas
            if (self.def.objectForKey("simplest_itemlist") != nil) {
                // Does have all the datas
                self.tableView.reloadData()
            }

            // Append new data
            self.itemList.append(itemText)
            self.tableView.reloadData()

            // Save to UserDefaults
            self.def.setObject(self.itemList, forKey: "simplest_itemlist")
            self.def.synchronize()

            print(self.itemList)
        }
    }
}

2 个答案:

答案 0 :(得分:2)

我以前处理过这个问题。不幸的是,在我的所有调查中,我得出了与你相同的结论。当警报按下按钮时,现在存在内置延迟。您更改或不在另一个线程上运行或运行的代码都不会阻止此延迟。其他人也证实这是Apple建立的功能。

答案 1 :(得分:0)

所以,如果我不得不下注它可能是因为所有这一切都发生在主线程上,这是有道理的,如果你在没有输入任何内容的情况下点击返回时没有发生问题。你想要你的应用程序尽可能响应,因此基于用户交互和基于UI的所有内容都将发生在主线程上。您可能想要做的是异步保存文本,这意味着保存您将使用输入文本执行的任何数据将发生在另一个不处理解除alertView的线程上。这有意义吗?