ios导航堆栈操作

我有问题试图从iOS应用程序操纵导航堆栈。 或者至less是由于这种操纵的结果。

我的情况:

我有3个ViewControllers。

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

显然我会select控制器a中的一个级别,这会触发控制器b的继续,一旦级别完成生病继续控制器c。 每一个阶段都是一个推动。

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

我现在面临的问题是,控制器a上显示的是后退,因为不应该有任何回退。 如果我点击后退,应用程序不会崩溃,button只是消失离开标题。

我试着添加:

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文章中所build议的那样,没有成功。 除此之外,这似乎不工作,似乎ios创build这些button从故事板没有我实际上添加它们,但不删除它们,当他们没有必要了。 这给我留下了一些select。

  • 要么我认为ios比实际更聪明
  • 我缺less一些重要的更新导航栏
  • 我去了这一切都错了

besdies即时通讯使用此代码剪切从控制器b继续c。

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

任何有关缺less操作或一般不良做法的提示,我们将不胜感激。

更新

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

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

你可以在你的视图控制器中尝试这个。 这将删除以前的视图控制器,在你的情况下,乙。 你还必须保持在你的堆栈(删除行[自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; } } 

我相信这样做的“正确”方法是删除控制器c上的后退button。 根据您如何以及何时移除控制器b,您可能正在损坏导航控制器堆栈。 操纵视图控制器堆栈通常不是一个好习惯。

要删除后退button,您有正确的代码:

 self.navigationItem.hidesBackButton = YES; 

但是,请注意,您必须在呈现视图控制器之前调用它,即像viewDidLoad

当你想要回到A时,使用:

 [self.navigationController popToRootViewControllerAnimated:YES];