5

在我们的故事板中,我们有多个UINavigationController堆栈。例如,LoginViewController堆栈与堆栈完全分离SWRevealViewController

在它们之间切换的最佳做法是什么?当我按下注销按钮(注销按钮在SWRevealController堆栈上)然后尝试显示 LoginViewController 堆栈时,我收到如下错误:

Warning: Attempt to present LoginViewController on SWRevealViewController whose view is not in the window hierarchy!

即使我在 App Delegate 中专门设置self.window.rootViewController了登录视图控制器,如下所示:UINavigationController

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Spitfire" bundle:nil];
UINavigationController *nav = [storyboard instantiateViewControllerWithIdentifier:@"LoginNavigationController"];
LoginViewController *loginVC = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];

self.window.rootViewController = nav;
[nav presentViewController:loginVC animated:NO completion:nil];    

有没有办法可以“关闭”当前UINavigationController堆栈并使用新堆栈?或者也许我不应该在我的应用程序委托中调用此代码?

4

3 回答 3

5

在你的问题之前我没有玩过SWRevealViewController,所以我之前的回答比较笼统。我在这里创建了一个示例应用程序,它尽最大努力抛出尽可能多的导航堆栈;我确定我已经涵盖了您的用例。

我会提请您注意以下几点:

  1. 我之前回答的“主要流程”正好在故事板的中间;这应该可以帮助您确定方向。

  2. SWRevealViewController.m可以与 Storyboards 结合使用,并且有一个非常聪明的 hack 方法,但是它的文档隐藏在 implementation 中。我花了一段时间才弄清楚到底发生了什么,但我的示例应用程序说明了用法(两个segue,一个用于“front”,另一个用于“back”,第三个用于“right”)。

  3. 应用程序的主要流程完全换成了备用流程。这是设计的SWRevealViewController。您实际上是在切换到一个全新的应用程序。

  4. 呈现的所有子流程都以模态方式破坏流程。

  5. 作者SWRevealViewController没有提供UIStoryboardSegue用于替换前、后、右视图控制器的子类。这实现起来很简单,但我选择在FHKSettingsViewController's 实现中手动进行交换。

  6. 我重复了代码并制作了一些小类,以确保我所做的事情是显而易见的。

于 2013-11-08T13:40:36.173 回答
0

您应该等到 rootViewController 上的 viewDidAppear 才调用 presentViewController。

有关更多讨论,请参见此处:谁的视图不在窗口层次结构中

于 2013-11-08T06:16:53.240 回答
0

编辑:

在方法中presentViewController从您的UINavigationcontroller'srootviewController调用viewDidAppear:

-(void)viewDidAppear:(BOOL)animated {

   LoginViewController *loginVC = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
   [self presentViewController:loginVC animated:NO completion:nil];
   [super viewDidAppear:YES];
}
于 2013-11-08T06:39:51.883 回答