ios导航堆栈操作

时间:2014-03-25 15:00:48

标签: ios objective-c uinavigationcontroller

我遇到问题尝试从ios应用程序操纵导航堆栈。或者至少是由于操纵导致的行为。

我的情况:

我有3个ViewControllers。

控制器a显示多个级别, 控制器b是游戏视图 控制器c是某种分数

显然,我将在控制器a中选择一个级别,一旦级别完成,就会触发到控制器b的segue到控制器c。每一个都是推动。

现在一旦进入控制器c,我不想使用后退按钮返回到b。我想回到控制器a。为了使其工作,我从堆栈中删除了控制器,因此不会移动到控制器b。这很好。

我面临的问题是,后退按钮确实显示在控制器a上,这似乎是关闭的,因为不应该有任何后退。如果我点击后退按钮,应用程序不会崩溃,按钮就会消失而留下标题。

我尝试添加:

    NSArray* controllers = [self.navigationController viewControllers];

    if ([controllers count]<=1) {
        [self.navigationItem setHidesBackButton:YES animated:YES];
    } else {
        [self.navigationItem setHidesBackButton:NO animated:YES];
    }
    [super viewDidAppear:animated];

正如一些相对stackoverflow文章中所建议的,没有成功。除了这不起作用之外,似乎ios从Storyboard创建了那些按钮而没有我实际添加它们,但是当它们不再需要时它们不会删除它们。这给我留下了一些选择。

  • 我认为ios比实际更聪明
  • 我遗漏了更新导航栏所必需的内容
  • 我犯了这个错误

besdies我使用此代码剪切从控制器b到c。

[self performSegueWithIdentifier:@"feedbackSegue" sender:self];
[self removeFromParentViewController];

非常感谢有关失踪操作或一般不良做法的任何提示。

更新

经过进一步调查,它不仅仅是后退按钮,而是关闭整个导航栏。它表现得好像被移除的控制器仍在那里。 BackButton在那里,另一端是uiActionButton。

导航栏是否将其状态存储在不同的堆栈中,而不是视图控制器?如果是这种情况,我也可以从这个堆栈中删除该状态,以保持一致。

2 个答案:

答案 0 :(得分:2)

您可以在视图控制器c中尝试此操作。这将删除以前的视图控制器,在您的情况下为b。您还必须将b保留在堆栈中(删除行[self removeFromParentViewController]';)

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    if(self.navigationController.viewControllers.count>2){
        NSArray *controllers = self.navigationController.viewControllers;
        NSMutableArray *newViewControllers = [NSMutableArray arrayWithArray:controllers];
        [newViewControllers removeObject:[controllers objectAtIndex:self.navigationController.viewControllers.count - 2]];
        self.navigationController.viewControllers = newViewControllers;
    }
}

答案 1 :(得分:1)

我认为“正确”的方法是删除控制器c上的后退按钮。根据您移除控制器b的方式和时间,可能会损坏导航控制器堆栈。操作视图控制器堆栈通常不是一个好习惯。

要删除后退按钮,您可以使用正确的代码:

self.navigationItem.hidesBackButton = YES;

但是,请注意,您必须在显示视图控制器之前调用它 - 例如,在 viewDidLoad 之类的内容。

如果要弹回A,请使用:

[self.navigationController popToRootViewControllerAnimated:YES];