准备segue不能按预期工作

时间:2017-05-03 11:35:27

标签: ios swift swift3 segue

我想使用performSegue转到另一个视图,如下所示

self.performSegue(withIdentifier: "successRegistration", sender: nil)

我希望在目的地视图中显示警告,以便覆盖准备功能,如下所示

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "successRegistration" {
            loginModel.alert(fromController: self)
            print("working")
        }
    }

但是准备功能似乎不起作用,因为working没有打印到控制台

我尝试删除prepare功能并将performSegue更改为

self.performSegue(withIdentifier: "successRegistration", sender: self.loginModel.alert(fromController: self))

以上一行确实打印了警报,但没有把我带到另一个视图。

如何在转到其他视图后显示警告?

3 个答案:

答案 0 :(得分:4)

在准备中向目标视图控制器显示警告将导致:

"Attempt to present UIAlertController on SecondViewController whose view is not in the window hierarchy!"

要实现您的目标,您只需在第二个视图控制器类中添加一个变量,并将其默认为false

//In your second view controller
var shouldPresentAlertOnOpen: Bool = false

然后你可以添加逻辑来在该视图控制器的viewWillAppear方法中显示警报,如下所示:

//Still in your second view controller
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    if shouldPresentAlertOnOpen {
        //Present your alert here
        let alert = UIAlertController(title: "My Alert", message: "My awesome message", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }
}

现在回到您的第一个视图控制器,您可以将您的准备方法更新为:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "successRegistration" {
        let destinationVC = segue.destination as! SecondViewController
        destinationVC.shouldPresentAlertOnOpen = true
    }
}

请注意,SecondViewController应该更新到第二个视图控制器类。

我很确定还有其他方法可以做到,这只是我的方法。

答案 1 :(得分:0)

检查一下:

self.performSegue(withIdentifier: "successRegistration", sender: self)

答案 2 :(得分:0)

您可以尝试这样:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "successRegistration" {
            loginModel.alert(fromController: segue.destinationViewController)
            print("working")
        }
}

并执行这样的segue:

self.performSegue(withIdentifier: "successRegistration", sender: self)

如果您将一些值传递给destinationViewController,并根据您尝试显示的值在下一个屏幕上显示警报,那将更加出色。传递的值可能类似于shouldDisplayLoginAlertOnLoad等。