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

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

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

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

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

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

override func viewDidLoad() {
        super.viewDidLoad()
        print("This should appear before the alert")
        let a = showPopUp(name: "John)

        print("This should appear after the response")
        print("John is a "+a)
        [...more code using variable 'a' ...]


}

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

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

Я не могу поместить код в действие предупреждения

Да, вы можете, и это то, что вы должны сделать.Действие - это ваш сигнал о том, что оповещение было отклонено (и оно также сообщает вам, какая кнопка была нажата в оповещении).Вам не нужно помещать сам код в действие;все, что вам нужно, это позвонить этот код.

Пример:

alert.addAction(UIAlertAction(title: "Boy", style: .default, handler: { action in
    self.myVeryLongFunction(genre:"Boy")
}))
0 голосов
/ 05 марта 2019

Создайте отдельную функцию и вызовите ее из обработчика завершения для ваших действий.

вот так

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

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

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

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

override func viewDidLoad() {
        super.viewDidLoad()
        print("This should appear before the alert")
        let a = showPopUp(name: "John)
}

func afterPopup(){
        print("This should appear after the response")
        print("John is a "+a)
        [...more code using variable 'a' ...]
}

Также следите за появлением всплывающего окна в ViewDidLoad.если это представление отображается, вы получите предупреждение (что может привести к странному поведению приложения)

0 голосов
/ 05 марта 2019

Оповещения работают не так, как вы могли бы ожидать, оно предполагает запрос пользователя и ожидает его действий, поэтому оно асинхронное

var genre = "Boy" // default

func showPopUp(name:String) {

   let alert = UIAlertController(title: "What are you "+name+"?", message: nil, preferredStyle: .alert)

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

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

   self.present(alert, animated: true)

}

func handleSelection() {
  print("current selected genre is \(genre)")
}

Плюс это

showPopUp(name: "John")

должно бытьвнутри viewDidAppear так как слишком рано представлять что-либо внутри viewDidLoad, где представления vc 'еще не были полностью заложены

var once = true
override func viewDidAppear(_ animated:Bool) {
  super.viewDidAppear(animated)
  if once {
     showPopUp(name: "John")
     once = false // to prevent re-showing it again
  }
} 
...