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];