在执行unwindSegue之前检查UIViewController是否已初始化

时间:2017-11-28 11:57:36

标签: ios swift uiviewcontroller segue unwind-segue

我的应用程序具有与此类似的结构:

enter image description here

当我第一次运行应用程序时,它会像这样通过VC:

LoadingVC > LoginVC > NavBarController_1 > VC1_1 > VC1_2 > NavBarController_2 > VC2_1 > VC2_2 > TabBarController_1 > NavBarController_3 > VC3_1_1

然而,当它第二次运行应用程序时,它将直接转到LoginVC > TabBarController_1 > NavBarController_3 > VC3_1_1

从这里我希望能够去VC1_1和NavBarController_1> VC1_1和NavBarController_2>汉堡包菜单中的VC2_1。

我的LoginVC看起来像这样:

if( CONDITION_1 == true )
{
    performSegue(withIdentifier: "loginVCToNavBarController_1", sender: self)
}
else if( CONDITION_2 == true )
{
    performSegue(withIdentifier: "loginVCToNavBarController_2", sender: self)
}
else
{
    performSegue(withIdentifier: "loginVCToTabBarController_1", sender: self)
}


override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
    print("LoginVC > prepareForSegue")

    if(segue.identifier == "loginVCToNavBarController_1")
    {
        _ = (segue.destination as! NavBarController_1)
    }
    else if(segue.identifier == "loginVCToNavBarController_2")
    {
        _ = (segue.destination as! LoginUserVC)
    }
    else if(segue.identifier == "loginVCToTabBarController_1")
    {
        _ = (segue.destination as! TabBarController_1)
    }
}

我仍然想弄清楚unwindSegues是如何工作的,所以这里是我的问题/问题:

予。当我在TabBarController_1中时,取决于应用程序流的方式,VC1_1和/或VC2_1可能已经初始化,所以我想知道何时应该执行正常的segue以及何时执行unwindSegue。

请记住,unwindSegue并不总是从一个VC到同一个导航控制器下的另一个VC,但主要是从一个VC到另一个NavBarController的根目录。

现在我可以想到两种方法:检查VC是否已初始化或者是否可以使用shouldPerformSegueWithIdentifier进行segue,但我似乎无法找到一些示例(或者我可能是没有找到正确的事情。)

我做了一些挖掘并找到了shouldPerformSegueWithIdentifier,但我不确定应该如何使用它。 根据Apple的说法,如果应该执行segue,那么shouldPerformSegueWithIdentifier会返回YES,如果应该忽略它,则返回NO。

不幸的是,我似乎无法了解条件是如何得到验证的。此外,如果我尝试print(self.shouldPerformSegue(withIdentifier: "unwindFromSideMenuVCToLoginUserVC", sender: self)),它总是返回TRUE。事实上,即使我使用segueIdentifier作为不存在的segue,它也会返回TRUE。

II。我已经有一个unwindSegue用于注销操作,但在这种情况下我知道LoginVC总是存在,因为我被迫通过它。

@IBAction func unwindFromSideMenuVCToLoginUserVC(segue:UIStoryboardSegue) { }

然而,在这种情况下,如果不是关闭应用程序,我再次登录,请使用普通的segue或unwindSegue? 或者我应该解雇所有控制器并返回root:

self.view.window?.rootViewController?.dismiss(animated: true, completion: nil)

在这种情况下,它将带我到LoadingVC,然后推送LoginVC。

有任何想法/建议吗?

1 个答案:

答案 0 :(得分:0)

UIViewController 具有名为 isViewLoaded 的属性,您可以使用它

例如

if vc.isViewLoaded {
 // perform segue
}
  

var isViewLoaded:Bool {get}

     

描述:   一个布尔值,指示当前是否加载了视图   记忆。当视图在内存中时,此属性的值为true   如果不是,则为假。访问此属性不会尝试   加载视图,如果它当前不在内存中。