使用Swift导航到三级深度的ViewController

3

我有一个ViewController,希望在从锁定屏幕打开推送通知时呈现。

该视图控制器嵌入在一系列视图控制器中,链如下:

TabbedBarController(根) -> NavigationController0 -> ViewController0 -> ViewController1 -> ViewControllerIWant

我有两个来自推送通知的变量,想传递到ViewControllerIWant中。

到目前为止,我有:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let rootVC = storyboard.instantiateViewControllerWithIdentifier("HomeVC") as! UITabBarController // HomeVC is the TabbedBarController
let NaviVC = storyboard.instantiateViewControllerWithIdentifier("NavigationController0") as! UINavigationController // NavigationController0 is the Navigation Controller for this stack

let ViewController0 = storyBoard.instantiateViewControllerWithIdentifier("ViewController0") as ViewController0
let ViewController1 = storyBoard.instantiateViewControllerWithIdentifier("ViewController1") as ViewController1
let ViewControllerIWant = storyBoard.instantiateViewControllerWithIdentifier("ViewControllerIWant") as ViewControllerIWant 

// Pass the Variables into ViewControllerIWant
ViewControllerIWant.Variable0 = "This is the first Variable"
ViewControllerIWant.Variable1 = "this is the second variable"
// Load the VC
self.presentViewController(ViewControllerIWant, animated:true, completion:nil)

我可以直接加载所需的ViewController,但这样会失去导航和选项卡控制器,因此需要关闭应用程序并重新加载才能向后移动。如何嵌套VC,以便用户滑动此通知时加载ViewControllerIWant?

1
使用适当的 presentpush 方法设置所有的 VC,传递 animated:false。(对于 presenting/pushing ViewControllerIWant 使用 true。) - Aaron Brager
只需将您的导航控制器上的viewControllers属性设置为包含3个视图控制器的数组即可。 - CSmith
2个回答

1
你可以直接设置 navigationController 的 viewControllers 属性,然后显示当前的 navigationController。
在你的示例中,应在以下这行代码之后添加此内容(我将所有内容改为小写。变量不应使用大写字母):
viewControllerIWant.variable1 = "this is the second variable"
naviVC.viewControllers = [viewController0, viewController1, viewControllerIWant]

0

您可以使用segue而不是呈现视图控制器来保留导航控制器。

一旦从起始VC创建到所需VC的segue,您就会为其指定一个标识符(例如“segueFromVC1ToVCIWant”)。

然后将该方法作为通知的操作调用:

    self.performSegueWithIdentifier("segueFromVC1ToVCIWant", sender: nil)

最终可以像这样传递变量:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if(segue.identifier == "segueFromVC1ToVCIWant"){
            let viewControllerIWant = segue.destinationViewController as! ViewControllerIWant
            ViewControllerIWant.variable0 = self.variable0
            ViewControllerIWant.variable1 = self.variable1
    }
}

请确保在ViewControllerIWant中使用相同的变量名以接收值。

所以AppDelegate没有Segue方法。 - Mathew Jenkinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接