UIAlertController препятствует выполнению перехода («окно не равно окну представления») - PullRequest
0 голосов
/ 21 мая 2019

После добавления UIAlertController в мое приложение для отображения диалогового окна прогресса во время выполнения какой-либо настройки segue больше не выполняет переключение на второй ViewController (см. Вопрос здесь - оказывается, виновник не тот, о котором я сначала подумал, поэтому я открываю новый вопрос).

Итак, теперь я настроил тестовый проект с использованием Swift 5, Xcode 10 и iOS 12, и я тоже столкнулся с такой же проблемой:

Описание:

  • ViewController1: имеет кнопку «Войти», которая вызывает onClickLoginButton
  • NavigationController: подключен к VC1 через "segue12" (я перетащил с желтого значка "ViewController")
  • ViewController2: я добавил NC к нему через "Embed in"; имеет UITableView
  • Нажатие на кнопку «Войти» отображает UIAlertController и затем следует выполнить переход к VC2. Вместо этого он только выводит сообщение в консоль (см. «Вывод консоли» ниже) и сохраняет загрузку VC1.

Раскадровка:

enter image description here

ViewController1:

class ViewController: UIViewController {

    @IBOutlet weak var loginButton: UIButton!

    var alert:UIAlertController!
    var alertMessage:String = ""

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func onClickLoginButton(_ sender: Any) {
        setUpDialog()
    }

    private func setUpDialog() {
        alertMessage = "Logging in"
        alert = UIAlertController(title: "Please wait", message: alertMessage, preferredStyle: UIAlertController.Style.alert)
        self.present(alert, animated: true, completion: nil)

        performSegue(withIdentifier: "segue12", sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        print("prepare 1->2a")
        let navVC = segue.destination as? UINavigationController
        let tableVC = navVC?.viewControllers.first as! ViewController2
        tableVC.test = "Test!"
        print("prepare 1->2b")
    }
}

ViewController2:

class ViewController2: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var test:String = ""

    override func viewDidLoad() {
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
        return cell
    }
}

Выход на консоль:

prepare 1->2a
prepare 1->2b
2019-05-21 13:09:16.981738+0200 SegueTest[3505:69382] <UIView: 0x7fc40fd0e790; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x600000dc3da0>>'s window is not equal to <UIAlertController: 0x7fc41180ba00>'s view's window!

Добавление этого к prepare (непосредственно перед print("prepare 1->2b")) удаляет диалоговое окно, но оно все еще выводит сообщение и не переключается на второе представление:

alert.dismiss(animated: true, completion: nil)

Что означает вышеуказанное сообщение (что его вызывает?) И как мне исправить это тестовое приложение, чтобы оно отображало диалоговое окно, а затем переключалось на ViewController2?

1 Ответ

1 голос
/ 21 мая 2019

Вы не можете подать предупреждение и сделать переход одновременно, используйте DispatchQueue.main.asyncAfter, чтобы создать ожидание

private func setUpDialog() {
    alertMessage = "Logging in"
    alert = UIAlertController(title: "Please wait", message: alertMessage, preferredStyle: UIAlertController.Style.alert)
    self.present(alert, animated: true, completion: nil)
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        self.alert.dismiss(animated: true, completion: {
            self.performSegue(withIdentifier: "segue12", sender: self)
        })
    }
}
...