从 appdelegate 转到视图控制器

Following a segue to a view controller from 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",并且所有导航项也都丢失了。

我做错了什么?

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

你可以使用这个:

    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)

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

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

编辑

从您的评论看来(尽管不是很清楚),您的 self.wondow.rootViewController 已经是包含导航控制器的 'tabBarController'。假设这一点,并且您知道 tabbarcontroller 中预期导航控制器的索引,您可以执行以下操作以使用 hierarchy

打开预期的视图控制器
  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

the last item added to the array becomes the top item of the navigation stack