使用 UIAlertController 时键盘延迟
Keyboard lags when using UIAlertController
我有一个副项目应用程序,它使用带有文本框的 UIAlertController 来获取用户的输入。我的问题是,当用户输入文本并按下 'Add' 时,键盘会在关闭之前保持打开状态 1-3 秒。但是,如果用户按下 return 键并在键盘上的文本框中输入文本,则不会发生这种情况。我最初认为这是使用完成处理程序并必须等待它完成,但由于使用 return 键工作正常,我认为情况并非如此。
这是我显示警报的地方:
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)
}
}
}
所以,如果我不得不打赌,这很可能是因为所有这些都发生在主线程上,如果您在没有输入的情况下点击 return 时问题没有发生,那么这是有道理的任何东西。你希望你的应用程序尽可能地响应,所以所有基于用户交互和 UI 的东西都将在主线程上发生。您可能想要做的是异步保存文本,这意味着您将对输入的文本进行的任何数据保存都将发生在另一个不处理关闭 alertView 的线程上。这有意义吗?
我之前处理过这个问题。不幸的是,在我所有的调查中,我得出了与您相同的结论。当在警报上按下按钮时,现在有一个内置延迟。您在另一个线程上更改或不 运行 或 运行 的任何代码都不会阻止此延迟。其他人也证实这是 Apple 构建的功能。
我有一个副项目应用程序,它使用带有文本框的 UIAlertController 来获取用户的输入。我的问题是,当用户输入文本并按下 'Add' 时,键盘会在关闭之前保持打开状态 1-3 秒。但是,如果用户按下 return 键并在键盘上的文本框中输入文本,则不会发生这种情况。我最初认为这是使用完成处理程序并必须等待它完成,但由于使用 return 键工作正常,我认为情况并非如此。
这是我显示警报的地方:
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)
}
}
}
所以,如果我不得不打赌,这很可能是因为所有这些都发生在主线程上,如果您在没有输入的情况下点击 return 时问题没有发生,那么这是有道理的任何东西。你希望你的应用程序尽可能地响应,所以所有基于用户交互和 UI 的东西都将在主线程上发生。您可能想要做的是异步保存文本,这意味着您将对输入的文本进行的任何数据保存都将发生在另一个不处理关闭 alertView 的线程上。这有意义吗?
我之前处理过这个问题。不幸的是,在我所有的调查中,我得出了与您相同的结论。当在警报上按下按钮时,现在有一个内置延迟。您在另一个线程上更改或不 运行 或 运行 的任何代码都不会阻止此延迟。其他人也证实这是 Apple 构建的功能。