2014-03-25 153 views
1

我有问题尝试从ios应用操纵导航堆栈。或者至少是因为这种操纵的行为。ios导航堆栈操作

我的情况:

我有3个ViewControllers。

控制器一个示出了多个级别, 控制器b是gameview 控制器C是某种得分

显然我将选择在控制器中的一个电平,这将触发一个SEGUE到控制器B,一旦水平是完成对控制器的不合格赛格。每一次都是推动。

现在一旦我在控制器c我不希望能够回到b使用后退按钮。我想回到控制器a。为了这个工作,我从堆栈中删除了控制器,所以不会移动到控制器b。这工作正常。

im面临的问题是,控制器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]; 

在一些相对计算器文章建议,但没有成功。除此之外,这看起来不像ios创建Storyboard中的那些按钮,而实际上并没有添加它们,但是当它们不再需要时,它们不会删除它们。这给我留下了一些选择。

  • 任我认为,IOS是聪明比它实际上是
  • 我缺少一些重要的更新导航栏
  • 我去这一切都错了

besdies即时通讯使用此代码剪断从控制器b切换到c。

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

任何有关缺失操作或一般不良做法的提示都将不胜感激。

更新

经过进一步调查,它不只是后退按钮,它的整个导航栏即关。它的行为就像删除的控制器仍然在那里一样。 BackButton在右端有另一个uiActionButton。

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

回答

2

你可以在你的视图控制器c中试试这个。这将删除以前的视图控制器,在你的情况下,b。你还不得不保持b在您的堆栈(删除行[自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; 
    } 
} 
+0

这是我在做什么,导致了同样的问题。问题是我实际上回到了控制器b。它的控制器仍然显示回来,即使无处可返回 –

+0

嗯,我没有任何问题,一定要将它添加在viewDidAppear虽然。 – streem

+1

我在viewdidload中做了完全相同的事情。我不太清楚为什么它有所作为,你是否删除了以前的视图控制器在didload或didappear(你可以点亮一些?),但它显然是有区别的。谢谢。 –

1

我认为‘正确’的方式做到这一点是要去除控制器C的后退按钮。根据您如何以及何时移除控制器b,您可能会损坏导航控制器堆栈。操纵视图控制器堆栈通常不是一个好习惯。

要删除后退按钮,你有正确的代码:

self.navigationItem.hidesBackButton = YES; 

但是请注意,你必须给出视图控制器之前调用此 - 就像viewDidLoad中即的东西。

当你想弹回给A,使用方法:

[self.navigationController popToRootViewControllerAnimated:YES]; 
+0

如果我要隐藏后退按钮,我可以添加一个自己的按钮,然后触发poptorootviewcontroller。它看起来不会有什么不同,但从我的头顶来看它是一个可行的选择。如果所有其他尝试都失败,那么肯定会把它当作某种最终方法。谢谢,但我不知道这是不错的做法。 ,如果我的做法不是很好,那么什么才是实现所需控制器行为的正确方法? –

+0

它看起来像设置您自己的自定义左栏按钮的方式,将按照您所描述的方式看起来和后退按钮的行为。请参阅:http://stackoverflow.com/questions/1214965/setting-action-for-back-button-in-navigation-controller –

+0

但是,我认为真正的问题是,有一个后退按钮做你所描述的是打破导航控制器的流程 - 也就是说,您希望点击回去做一些事情,而不是让您回到前一个视图控制器。我的建议是将弹出窗口添加到root vc功能,而不是后退按钮。 –