这是我的故事板
如上所述,我添加了一个注销按钮,以便到达第一个视图。
当应用程序启动时,它看起来像这样:
登录后,它会转到一个标签栏,如下所示:
我已将“注销”按钮与第一个视图和所选推送连接起来。但当我推出“退出”时会发生这种情况:
我希望登录视图显示原样,但是会出现标签栏以及我不希望它出现的“后退”按钮。
*前3个标签项目有自己的导航控制器,注销按钮位于第一个标签项目上。
答案 0 :(得分:5)
<强>更新强>
我现在明白了TabBarController是来自loginController的呈现。
正确的返回方式是:
[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];
我将在下面的注释中留下,他们假设我们正在处理UINavigationController层次结构。还是值得一读!
这是一个部分答案...在我写完之后我意识到你的标签栏控制器不是登录NavController堆栈的一部分(我不管怎么说),所以它不起作用 - 但你应该无论如何阅读它,以了解为什么Segue / PUSHing不是要走的路。
我稍后会为您的案例更新更准确的答案......
你不想使用segue或推送......想象它就像一叠卡片,推动就是在堆栈中添加更多卡片,所以你要在你的登录界面中添加一个版本NavPatroller堆栈,包含在Tab Bar Controller中。这是 not 与您已创建的登录屏幕相同的实例,它是一个新实例( push 创建一个新实例)。
您想从堆叠中移除卡片并返回第一张卡片。这是POP操作。
其中一种可行。
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated
它们是UINavigationController
方法。您可以从最顶层的UIViewController
访问它们,如下所示:
[self navigationController] popToRootViewControllerAnimated:NO;
[self navigationController] popToViewController:myLogInViewController animated:YES;
您可以通过在viewController中放置IBAction来从注销按钮触发它们。
您想要返回的viewController看起来确实是您的根视图控制器,因此请使用它并查看它是否有效。如果没有,您将需要对要返回的viewController的引用。你可以通过计算堆栈来做到这一点。堆栈作为导航控制器的viewControllers
数组属性进行访问。例如,如果它是rootViewController的第二个viewController,
UIViewController* logInViewController =
[[self navigationController] viewControllers] objectAtIndex:1];
会得到你追求的人。
答案 1 :(得分:2)
我对所有View Controller使用相同的导航,然后首先从导航堆栈中找出Fisrt viewController对象并弹出到该视图。
例如:
-(void)popToSelectedViewController
{
NSArray *viewC=[self.navigationController viewControllers];
FirstViewC *firstVC=nil;
for (int i=0; i<[viewC count]; i++)
{
UIViewController *tempVC=[viewC objectAtIndex:i];
if([tempVC isKindOfClass:[FirstViewC class]])
{
firstVC=[viewC objectAtIndex:i];
break;
}
}
if(firstVC)
[self.navigationController popToViewController:firstVCanimated:YES];
else
[self.navigationController popToRootViewControllerAnimated:YES];
}
这个metod将在导航堆栈中找到你的第一个VC并弹出到那个视图。
我希望这会有所帮助。
编辑后的另一个问题:
请将编辑后的图像称为故事板中的N1和N2类。我不知道你的名字是什么,所以我把它写成N1和N2。
在Class N2中添加通知: 在你的N2级别的View DidLoad中写下这个
-(void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(popToRooToview) name:@"PopView" object:nil];
//other stuffs
}
并将通知选择器定义为:
-(void)popToRooToview
{
[self.navigationController popViewControllerAnimated:YES];
}
删除viewDidUnLoad中的通知观察者
-(void)viewDidUnload
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"PopView" object:nil];
}
现在在你的N1类中点击Logout Btn调用这个方法:
-(void)logoutButtonClicked
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"PopView" object:nil];
}
//记住通知名称“PopView”对于N1类中的通知是相同的,并且在N2中发布类的通知