UINavigationController 不推送视图控制器

Posted

技术标签:

【中文标题】UINavigationController 不推送视图控制器【英文标题】:UINavigationController not pushing view controller 【发布时间】:2012-10-01 13:53:17 【问题描述】:

我创建了一个具有登录名的应用程序。

它从一个欢迎视图控制器开始,检查用户是否登录,如果没有,打开一个登录视图控制器。如果用户已登录,或者一旦用户登录,就会像这样将用户推送到 Home View Controller。

App Delegate (did finish launching)

self.welcomeViewController = [[APPWelcomeViewController alloc] init];
self.homeViewController = [[APPHomeViewController alloc] initWithNibName:@"APPHomeViewController" bundle:nil];

self.navController = [[UINavigationController alloc] initWithRootViewController:self.welcomeViewController];
self.navController.navigationBarHidden = YES;

self.window.rootViewController = self.navController;

一旦用户登录,它就会推送主页视图。

// Push the homeViewController onto the navController
[self.navController pushViewController:self.homeViewController animated:YES];

到目前为止,这一切都很好。然后我使用模态视图控制器进行设置,其中包括一个注销按钮。用户的注销运行这个:

// Log the user out
[User logOut];

// Then we need to remove the Settings Modal View Conrtoller
[self.presentingViewController dismissModalViewControllerAnimated:YES];

// Then we need to take user back to welcomeViewController
[self.navigationController pushViewController:welcomeViewController animated:YES];

它会按预期关闭设置视图控制器,但导航控制器仍保留在主页视图上。没有错误,有谁知道为什么这不能正常工作?

【问题讨论】:

删除这一行 [self.navigationController pushViewController:welcomeViewController animated:YES];告诉我我们发生了什么? 【参考方案1】:

通过重新排列代码解决。在 appdelegate 上搜索当前用户,然后要么加载带有主视图根控制器的导航控制器,要么运行加载欢迎视图控制器的方法。

欢迎视图控制器也会检查用户,如果不是当前用户,它会显示模式登录视图控制器

【讨论】:

【参考方案2】:

一旦你用包含欢迎视图控制器的导航控制器初始化你的窗口,你就不需要推送导航控制器。

如果你想在这个堆栈中添加更多视图(在欢迎视图控制器内)你调用方法 self.navigation 控制器 pushviewcontroller ...如果你想从堆栈中删除,调用 popviewcontroller..你会去你的主视图堆栈(根)。

【讨论】:

是否每个被推送到导航控制器的视图控制器都保留在堆栈中,直到您将其弹出?如果是这样,我应该弹出主视图控制器以返回欢迎视图,还是有办法从现有堆栈列表中更改当前显示的视图控制器。下面的建议没有奏效,它仍然在家里。【参考方案3】:

试试这个:

// Take me back to the root navigation view controller (APPWelcomeViewController)
[self.navigationController popToRootViewControllerAnimated:YES];

【讨论】:

以上是关于UINavigationController 不推送视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何在不推送到服务器的情况下更新中继存储

关闭 UINavigationController 并呈现另一个 UINavigationController

iOS:如何在现有 UINavigationController 中打开另一个 UINavigationController?

带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller

带有 UINavigationController 的 UITabBarController,在 hidesBottomBarWhenPushed 上隐藏 UINavigationController

在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?