UIAlertController禁止执行Segue(“窗口不等于视图的窗口”)

时间:2019-05-21 11:56:46

标签: ios swift segue uialertcontroller

在我的应用中添加UIAlertController以显示进度对话框并执行设置后,segue不再执行切换到第二个ViewController的操作(请参阅问题{{3} }-原来,罪魁祸首不是我最初想的,这就是为什么我要提出一个新问题)。

所以现在我使用Swift 5,Xcode 10和iOS 12设置了一个测试项目,在那里我也遇到了相同的问题:

说明:

  • ViewController1:具有一个“登录”按钮,该按钮调用onClickLoginButton
  • NavigationController:通过“ segue12”连接到VC1(我从黄色的“ ViewController”图标中拖动)
  • ViewController2:我通过“嵌入”向其中添加了NC;有一个UITableView
  • 单击“登录”按钮将显示UIAlertController,然后应执行到VC2的设置。相反,它仅在控制台中输出一条消息(请参见下面的“控制台输出”)并保持VC1的加载。

故事板:

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 个答案:

答案 0 :(得分:1)

您无法同时发出警报和进行搜索,请使用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)
        })
    }
}