从tabbar返回到第一个视图

时间:2013-01-12 19:20:54

标签: iphone cocoa-touch uitabbarcontroller uistoryboard

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

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

2 个答案:

答案 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并弹出到那个视图。

我希望这会有所帮助。

编辑后的另一个问题:

your image

请将编辑后的图像称为故事板中的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中发布类的通知