为 segue 做准备没有按预期工作

Posted

技术标签:

【中文标题】为 segue 做准备没有按预期工作【英文标题】:prepare for segue doesn't work as expected 【发布时间】:2017-05-03 11:35:27 【问题描述】:

我想使用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))

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

如何在切换到另一个视图后显示警报?

【问题讨论】:

您应该在目标视图控制器的viewDidAppear 中显示警报,或者在警报解除后显示警报然后执行segue。您不能同时使用两者 @Paulw11 目前正在尝试实现它,感谢您的建议 【参考方案1】:

在准备中的目标视图控制器上显示警报会导致:

"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)
    

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

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

请注意,应将 SecondViewController 更新为您的第二个视图控制器类。

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

【讨论】:

【参考方案2】:

你可以这样尝试:

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 等。

【讨论】:

【参考方案3】:

检查这个:

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

【讨论】:

以上是关于为 segue 做准备没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

剑道网格没有按预期工作

SQLite 事务没有按预期工作

ViewController 未按预期执行 segue

R:lubridate 的 dst() 没有按预期工作

我的挤压功能没有按预期工作,我该怎么做才能修复这个功能?

JQuery 最后一个选择器没有按预期工作