我有一个场景可能需要重命名,我想使用UIAlertController
来收集新名称。我希望这对于一次性的几次改变是健壮的(尽管不太可能,我想支持它)。
问题是我只需要在当前UIAlertController
的结果出现时继续循环,因为循环会立即继续,当然不能同时出现多个循环。我整天都被困在这里,需要帮助。
我需要某种使用完成处理程序的方法来为下一个循环迭代提供绿灯。
这是问题的简化版本,changeNames func位于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)
}
}
由于
答案 0 :(得分:4)
使用异步代码进行循环很困难,我宁愿选择递归:
func showChangeAlerts(for texts: [String]) {
guard let value = texts.first else { return }
let alert = UIAlertController(title: "Rename \(value)",
message: "What would you like to call \(value)?",
preferredStyle: .alert)
alert.addTextField(configurationHandler: { (textField
textField.text = value
})
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak alert, weak self] (_) in
let newValue = alert?.textFields![0].text ?? ""
print("User changed \(value) to \(newValue)")
self?.showChangeAlerts(for: Array(texts.dropFirst()))
}))
self.present(alert, animated: true)
}
传入一个字符串数组,这个方法将完成它们直到所有字符串都被处理完毕。
修改强>
好的,只是看到Ron Nabuurs用一个非常相似的解决方案打败了我:)主要的区别是我的方法没有使用额外的迭代器参数,但是"消耗"提供的数组中的字符串,直到它为空。但原则是一样的。
答案 1 :(得分:2)
我没有测试过这个,因为我现在没有mac。我的斯威夫特生锈了,但总的想法就在那里:P。递归是这里要做的事情:
var names = ["Bob","Kate"]
func changeNames(names: [String], iterator: Int = 0){
if (names.count >= iterator) {
let alert = UIAlertController(title: "Rename \(names[iterator])",
message: "What would you like to call \(names[iterator])?",
preferredStyle: .alert)
alert.addTextField(configurationHandler: { (textField) in
textField.text = names[iterator]
})
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak alert] (_) in
print("User changed \(names[iterator]) to \(alert!.textFields![0].text)")
changeNames(names, iterator + 1)
}))
self.present(alert, animated: true)
}
}