从 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
打开预期的视图控制器
收到推送通知后访问 tabBaController :
如果让 tabBarController = self.window.rootViewController 作为? UITabBarController
访问选项卡栏控制器中的导航控制器:(代码假定预期的导航控制器是第一个选项卡。根据您的设置更改代码中的索引)
如果让 navController = tabBarController.viewControllers[0] 作为? UITabBarController
在此导航控制器上创建一个包含所有视图控制器的数组,并使用 setViewControllers
方法设置它们:
var viewControllersArray : [UIViewController] = UIViewController;
viewControllersArray.append(view1controller)
viewControllersArray.append(view1detailcontroller)
navController.setViewControllers(viewControllers : viewControllersArray, animated : true)
在这里,像在代码形式故事板中一样实例化 view1controller
和 view1detailcontroller
,并注意以下形式 setViewControllers documentation
the last item added to the array becomes the top item of the
navigation stack
从应用委托转到视图控制器的正确方法是什么?当我收到推送通知时,我正在将用户转移到视图控制器,但是,视图并不完整。导航栏看起来不对。这是我的设置:
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
收到推送通知后访问 tabBaController :
如果让 tabBarController = self.window.rootViewController 作为? UITabBarController
访问选项卡栏控制器中的导航控制器:(代码假定预期的导航控制器是第一个选项卡。根据您的设置更改代码中的索引)
如果让 navController = tabBarController.viewControllers[0] 作为? UITabBarController
在此导航控制器上创建一个包含所有视图控制器的数组,并使用
setViewControllers
方法设置它们:var viewControllersArray : [UIViewController] = UIViewController; viewControllersArray.append(view1controller) viewControllersArray.append(view1detailcontroller) navController.setViewControllers(viewControllers : viewControllersArray, animated : true)
在这里,像在代码形式故事板中一样实例化
view1controller
和view1detailcontroller
,并注意以下形式 setViewControllers documentation
the last item added to the array becomes the top item of the navigation stack