Пауза для цикла до получения ответа UIAlertController в Swift - PullRequest
0 голосов
/ 13 марта 2019

Я пытался получить ответ от пользователя из UIAlertController. Проблема в том, что код все еще выполняется, пока отображается UIAlertController. Я хотел бы показать предупреждение, а затем подождать, пока пользователь даст ответ, чтобы продолжить код.

func showPopUp(name:String)->String{
   var gender = ""
   let alert = UIAlertController(title: "What are you "+name+"?", message: nil, preferredStyle: .alert)

   alert.addAction(UIAlertAction(title: "Boy", style: .default, handler: { action in
       gender = "Boy"
   }))

   alert.addAction(UIAlertAction(title: "Girl", style: .default, handler: { action in
       gender = "Girl"
   }))

   self.present(alert, animated: true)
   return gender
}

override func viewDidLoad() {
    super.viewDidLoad()
    print("This should appear before the alert")
    var characters: [String] = ["John", "Tom", "Martha"]
    for ch in characters{
       let a = showPopUp(name: ch)
       print(ch + " is a "+ a)
    }
}

Я не могу поместить код в действие оповещения, потому что он находится внутри цикла for, и поэтому он продолжается без указания пола.

1 Ответ

1 голос
/ 13 марта 2019

Вам необходимо использовать обработчик завершения, поскольку пользовательский ввод происходит асинхронно, поэтому вы не можете вернуть его, используя синхронный return.

Не имеет отношения к вашей проблеме, но вы должны использовать интерполяцию строк вместо + для объединения строк.

func showPopUp(name:String, genderCompletion: @escaping (String)->()) {
    let alert = UIAlertController(title: "What are you \(name)?", message: nil, preferredStyle: .alert)

    alert.addAction(UIAlertAction(title: "Boy", style: .default, handler: { action in
        genderCompletion("Boy")
    }))

    alert.addAction(UIAlertAction(title: "Girl", style: .default, handler: { action in
        genderCompletion("Girl")
    }))

    self.present(alert, animated: true)
}

override func viewDidLoad() {
    super.viewDidLoad()
    let characters: [String] = ["John", "Tom", "Martha"]
    for ch in characters{
        showPopUp(name: ch, genderCompletion: { gender in
            print("\(ch) is a \(gender)")
        })
    }
}
...