【发布时间】:2018-04-09 11:56:14
【问题描述】:
我遇到了一个可能需要重命名的情况,我想使用UIAlertController 来收集新名称。我希望它能够同时进行多项更改(尽管不太可能,但我愿意支持它)。
问题是我需要循环仅在当前UIAlertController 的结果出现时继续,因为它是循环立即继续,当然不能同时出现多个。我整天都被困在这个问题上,需要帮助。
我需要某种使用完成处理程序为下一次循环迭代开绿灯的方法。
这是一个简化版的问题,changeNames函数在UIViewController中。
var names = ["Bob","Kate"]
func changeNames(){
for name in names {
let alert = UIAlertController(title: "Rename \(name)",
message: "What would you like to call \(name)?",
preferredStyle: .alert)
alert.addTextField(configurationHandler: { (textField) in
textField.text = name
})
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak alert] (_) in
print("User changed \(name) to \(alert!.textFields![0].text)")
//Don't continue the loop until now
}))
self.present(alert, animated: true)
}
}
谢谢
几年后重新审视这个问题
这个问题的基本前提是完全有缺陷的,我是从 VBA 开发人员的角度来看的,对异步代码的理解不足。
这种方法有一些问题:
- 通过 UIAlertControllers 收集大量信息真的很糟糕的用户体验 - 专用 UI 会更好
- for 循环是表达意图的糟糕方式 - 一堆“itemsToChange”会更好;一项的完成可以启动下一项的处理程序,直到堆栈为空
【问题讨论】:
-
您可以不使用 for 循环,而是递归地遍历名称列表
-
你为什么使用for循环??
-
绝对不是这样……你想达到什么目的?为什么这里需要一个 for 循环?
-
@holex 它是 UICollectionView 的一部分,它具有一个可重用的函数,该函数采用一个动作闭包并将其在 for 循环中应用于集合视图中的所有选定项目
标签: ios swift uialertcontroller