如何在For循环中使用UIAlertController

时间:2018-04-09 11:56:14

标签: ios swift uialertcontroller

我有一个场景可能需要重命名,我想使用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)
    }
}

由于

2 个答案:

答案 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)
    }
}