在具有后退按钮的视图控制器之间始终返回到根目录

时间:2014-09-14 13:03:37

标签: ios objective-c uiviewcontroller uinavigationcontroller uistoryboard

我在导航控制器中有三个视图控制器。一个是根,其他应该分别在满足conditionA或conditionB时出现。

如果两个条件都为真,我希望显示conditionA View Controller。如果事情发生变化,且条件A不再满足,但条件B仍然存在,我想显示conditionB View Controller。这意味着我希望能够从conditionA View Controller转到conditionB View Controller,反之亦然,直到满足这两个条件。但是,我总是希望后退按钮将用户发送到根目录。

为了实现这一点,同时避免诸如“在意外状态下完成导航过渡”之类的错误,我从Dave DeLong的回答https://stackoverflow.com/a/11821263/2524427中获取了代码。

(void)somethingChanged:(NSNotification*)notification
{
    if(!conditionA && !conditionB){return;}

    NSArray *viewControllers = self.navigationController.viewControllers;
    NSMutableArray *newViewControllers = [NSMutableArray array];
    // preserve the root view controller
    [newViewControllers addObject:[viewControllers objectAtIndex:0]];

    if(conditionA)
    {
        // add the new view controller
        [newViewControllers addObject:[self.storyboard instantiateViewControllerWithIdentifier:@"conditionAViewController"]];
        // animatedly change the navigation stack
        [self.navigationController setViewControllers:newViewControllers animated:YES]; 
        return;
    }

    if(conditionB)
    {
        // add the new view controller
        [newViewControllers addObject:[self.storyboard instantiateViewControllerWithIdentifier:@"conditionBViewController"]];
        // animatedly change the navigation stack
        [self.navigationController setViewControllers:newViewControllers animated:YES]; 
    }
}

这几乎完美无缺。但是,如果我有以下序列

  1. 触发了一些只在满足条件B的情况下触发了 - >出现conditionB View Controller - 根据需要
  2. somethingChanged再次触发,但现在条件A和条件B都满足 - >条件显示视图控制器 - 根据需要
  3. somethingChanged第三次触发,现在回到初始状态,只满足conditionB - >我返回根视图控制器(使用后退按钮)而不是conditionB View Controller ...
  4. 如何在这些视图控制器之间来回切换?

1 个答案:

答案 0 :(得分:0)

而不是您链接的问题中的解决方案。试试这个

  1. 在条件A视图控制器和条件B视图控制器中启用您自己的后退按钮UIBarButtonItem作为navigationBar的leftBarButtonItem

  2. 连接一个动作

    - (IBAction)dismiss:(id)sender {
        [self.navigationController popToRootViewControllerAnimated:YES];
    }