从tabbar返回到第一个视图

ozm*_*max 2 iphone cocoa-touch uitabbarcontroller uistoryboard

这是我的故事板
故事板 如上所述,我添加了一个注销按钮,以达到第一个视图.

当应用程序启动时,它看起来像这样:
开始
登录后,它会转到一个标签栏,如下所示:
登出
我已将"注销"按钮与第一个视图和选定的推送连接起来.但是当我推出"退出"时会发生这种情况:
错误
我希望登录视图按原样显示,但是会出现标签栏以及我不希望它出现的"后退"按钮.
*前3个标签项目有自己的导航控制器,注销按钮位于第一个标签项目上.

fou*_*dry 5

更新
我现在明白TabBarController是从loginController 呈现的.

那么返回的正确方法是:

[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

我将在下面的注释中留下,他们假设我们正在处理UINavigationController层次结构.还是值得一读!


这是一个部分答案...在我写完之后我意识到你的标签栏控制器不是你的登录NavController堆栈的一部分(我不管怎么说),所以它不起作用 - 但你应该读它理解为什么Segue/PUSHing不是要走的路.

我稍后会为您的案例更新更准确的答案...

你不想使用segue,或者推送PUSH ......想象它就像一堆卡片,推动是在堆栈中添加更多的卡片,所以你要将一个版本的登录屏幕添加到你的NavController堆栈中包含在标签栏控制器中.这是不是你的登录屏幕相同的实例,你已经创建,它是一个新的实例(使一个新的实例).

您想要从堆栈中移除卡片并返回到您的第一张卡片.这是POP操作.

其中一个将起作用.

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated
Run Code Online (Sandbox Code Playgroud)

他们是UINavigationController方法.您可以从最顶层访问它们,UIViewController如下所示:

[self navigationController] popToRootViewControllerAnimated:NO;

[self navigationController] popToViewController:myLogInViewController animated:YES;
Run Code Online (Sandbox Code Playgroud)

您可以通过在viewController中放置IBAction来从注销按钮触发它们.

看起来你想要返回的viewController确实是你的根视图控制器,所以请使用它来查看它是否有效.如果没有,您将需要对要返回的viewController的引用.你可以通过计算堆栈来做到这一点.堆栈作为viewControllers导航控制器的数组属性进行访问.例如,如果它是rootViewController的第二个viewController,

UIViewController* logInViewController = 
        [[self navigationController] viewControllers] objectAtIndex:1];
Run Code Online (Sandbox Code Playgroud)

会得到你追求的那个.