我遇到问题尝试从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创建了那些按钮而没有我实际添加它们,但是当它们不再需要时它们不会删除它们。这给我留下了一些选择。
besdies我使用此代码剪切从控制器b到c。
[self performSegueWithIdentifier:@"feedbackSegue" sender:self];
[self removeFromParentViewController];
非常感谢有关失踪操作或一般不良做法的任何提示。
更新
经过进一步调查,它不仅仅是后退按钮,而是关闭整个导航栏。它表现得好像被移除的控制器仍在那里。 BackButton在那里,另一端是uiActionButton。
导航栏是否将其状态存储在不同的堆栈中,而不是视图控制器?如果是这种情况,我也可以从这个堆栈中删除该状态,以保持一致。
答案 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];