继续从appdelegate到视图控制器

问题描述:

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

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”,并且所有导航项目也都会丢失。

我在做什么错?

+0

这是什么'nav.pushViewController(view1detailcontroller,animated:true)' –

+0

我需要转换到view1detailcontroller – Prabhu

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

而是访问现有的选项卡视图控制器,并且它是子导航控制器以推送您的新视图控制器。如果您需要更多帮助来完成这项工作,您需要分享更多代码/故事板屏幕截图,以了解您现有的设置。

编辑

从您的意见,似乎(虽然不是很清楚),你self.wondow.rootViewController已经是你的“tabBarController”包含导航控制器。假设这一点,你知道tabbarcontroller在您预期的导航控制器的索引,你可以做以下同层次

  1. 打开你的意图视图控制器在收到推送通知的访问tabBaController:

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

  2. 访问标签栏控制器内导航控制器:(代码假定打算导航控制器是第一选项卡根据您的设置在代码更改索引。)

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

  3. 创建此导航控制器上要所有的视图控制器的阵列,并且使用setViewControllers方法设置它们:

    VAR viewControllersArray:[UIViewController中] = UIViewController中; viewControllersArray.append(view1controller) viewControllersArray.append(view1detailcontroller) navController.setViewControllers(viewControllers:viewControllersArray,动画:真)

  4. 这里,实例化view1controllerview1detailcontroller,你在你的代码形式的故事板做,注意以下几点形式setViewControllers documentation

的最后一个项目添加到数组成为 导航堆栈

的顶部项目
+0

谢谢。我如何访问tabview控制器的导航控制器?我有我的tabview控制器是这样的:var mainViewController = storyboard.instantiateViewControllerWithIdentifier(“main”)as UIViewController self.window?.rootViewController = mainViewController – Prabhu

+0

等等!在这个问题中,你的代码提到了'main'作为你想要推送的view controller的storyboard标识符,并且在这个评论中你说它是你的tabviewcontroller的标识符。哪一个? – lukya

+0

我的故事板中标签viewcontoller的名称是'main'。它有一个导航控制器,它有两个视图控制器(view1controller和view1detailcontroller)。基本上,我希望用户去view1detailcontroller,同时保持后退按钮和标签。 – Prabhu

而不是直接从主故事板中推送视图控制器,你应该得到topViewController或visibleController并在topController上推动所需的viewController,以便它将保持你的视图控制器的堆栈,你会得到你想要的。

+0

请问您能帮我解决一些代码吗?我是新来的迅速。谢谢! – Prabhu

+0

我可以写一个算法,你应该怎么做 – devjangir

+0

我可以写一个算法,你应该怎么做,就像先获取窗口rootviewcontroller一定是你的navigationController,然后在UINavigationController上获取topController,如果这是detailViewController然后使用这个并推送你的数据,否则遍历UINavigationController的堆栈控制器的所有控制器并获取detailController的对象,并使用此VC来推送您的代码。 – devjangir

您可以使用此:

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) 
+0

问题在于它不保留我的标签视图和导航堆栈。 – Prabhu

+0

您可以在下一个视图控制器中设置:覆盖func viewWillAppear(动画:布尔){ super.viewWillAppear(动画) self.navigationController?.setNavigationBarHidden(true,animated:animated) } – User511