跟随appdelegate的视图控制器

时间:2016-11-28 06:57:12

标签: ios swift2 segue uistoryboard

从app委托中转换到视图控制器的正确方法是什么?当我收到推送通知时,我正在将用户转换为视图控制器,但视图不完整。导航栏看起来不正确。这是我的设置:

tabviewcontroller (storyboard name is 'main')
 - nav1controller -> view1controller -? view1detailcontroller (storyboard name is 'view1detail')
 - nav2controller -> ...

当推送通知到达时,我想将用户带到veiw1detailcontroller。我想允许用户返回view1controller。

这是我的代码:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let mainViewController = storyboard.instantiateViewControllerWithIdentifier("main") as! UIViewController

let view1detailcontroller = storyboard.instantiateViewControllerWithIdentifier("view1detail") as! view1detailcontroller

let nav = UINavigationController(rootViewController: mainViewController)
nav.pushViewController(view1detailcontroller, animated: true)
self.window!.rootViewController = nav

因此,它可以很好地转换为view1detailcontroller。但是,一旦我回到view1controller,该屏幕和所有其他屏幕上的导航栏会显示“main”,并且所有导航项也都会丢失。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

通过创建新的导航控制器并设置self.window!.rootViewController = nav,您基本上可以重置整个视图堆栈。 (例如,您将丢失第一个视图层次结构引用中提到的tabviewcontroller

相反,访问现有的选项卡视图控制器及其子导航控制器以推送新的视图控制器。如果您需要有关如何完成此操作的更多帮助,则需要共享更多代码/故事板屏幕截图以了解您现有的设置。

修改

根据您的评论,似乎(虽然不是很清楚),您的self.wondow.rootViewController已经是您的tabBarController'其中包含导航控制器。假设这一点,并且您知道tabbarcontroller中预期导航控制器的索引,您可以执行以下操作以打开具有层次结构的预期视图控制器

  1. 收到推送通知后,访问tabBaController:

    如果让tabBarController = self.window.rootViewController为?的UITabBarController

  2. 访问标签栏控制器中的导航控制器:(代码假定预期的导航控制器是第一个标签。根据您的设置更改代码中的索引)

    如果让navController = tabBarController.viewControllers [0]为?的UITabBarController

  3. 在此导航控制器上创建所需的所有视图控制器的数组,并使用setViewControllers方法设置它们:

    var viewControllersArray:[UIViewController] = UIViewController; viewControllersArray.append(view1controller) viewControllersArray.append(view1detailcontroller) navController.setViewControllers(viewControllers:viewControllersArray,animated:true)

  4. 在此处,您可以像在代码表格情节提要中一样实例化view1controllerview1detailcontroller,并注意以下表单setViewControllers documentation

  5.   

    添加到数组中的最后一项成为该项的顶部项   导航堆栈

答案 1 :(得分:0)

而不是直接从主故事板推送视图控制器,你应该获得topViewController或visibleController并在topController上推送所需的viewController,这样它将维护你的ViewController堆栈,你就会得到你想要的。

答案 2 :(得分:0)

您可以使用:

    var rootViewController = self.window!.rootViewController as UINavigationController
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    var viewController = mainStoryboard.instantiateViewControllerWithIdentifier("view") as ViewController
    rootViewController.pushToViewController(viewController, animated: true)