我想调用一个新的视图控制器并从导航控制器堆栈中删除当前视图控制器。 例如。我在控制器A中,我打电话给B。
现在我在堆栈A,B中。 现在我想打电话给C(来自B)。 我希望堆栈是A,C。
感谢。
答案 0 :(得分:23)
在ARC的背景下,这是一个可能的解决方案:
NSMutableArray* navArray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers];
[navArray replaceObjectAtIndex:[navArray count]-1 withObject:nextViewController];
[self.navigationController setViewControllers:navArray animated:YES];
正如您所知,此代码替换了您尝试从堆栈中删除的视图中的常用推送代码(在您的问题中为“B”)。第1行将视图控制器列表从导航控制器堆栈复制到NSMutableArray
。第2行用我们想要转到下一个(“C”)的视图替换最后一个(最顶部)视图。第3行使实际的nav-controller的堆栈成为我们改变的数组,并动画转换到最顶层的项目。 (当然你不能在root viewController中使用这个代码。)
我找到了另一种方式here并将其改编为ARC:
UINavigationController *navController = self.navigationController;
[navController popViewControllerAnimated:NO];
[navController pushViewController:someViewController animated:YES];
第一行是必需的,因为一旦您将当前视图从堆栈中弹出,self.navigationController
将为nil
,第三行将无效。与前一种方式相同的行数,但这种方式通过内置方法而不是“手动”摆弄堆栈。
答案 1 :(得分:5)
这就是答案。
以下代码弹出当前视图控制器。
UINavigationController *navController = self.navigationController;
// retain ourselves so that the controller will still exist once it's popped off
[[self retain] autorelease];
[navController popViewControllerAnimated:NO];
这推动了新的推荐:
ViewControllerC *viewC = [[ViewControllerC alloc] init];
[navController pushViewController:viewC animated:TRUE];
希望它有所帮助!
答案 2 :(得分:4)
删除倒数第二个导航项:
NSMutableArray *navigationStack = [[NSMutableArray alloc] initWithArray:
self.navigationController.viewControllers];
[navigationStack removeObjectAtIndex:[navigationStack count] - 2];
self.navigationController.viewControllers = navigationStack;
例如,从控制器C上的viewDidLoad
运行此命令以从导航堆栈中删除控制器B.
答案 3 :(得分:0)
我认为你可以通过首先从导航堆栈中弹出B然后将C推入其中来实现此目的。你应该能够使用[UINavigationController popViewControllerAnimated]和[UINavigationController pushViewController:animated]。
答案 4 :(得分:-2)
您可以使用此代码。
NSMutableArray * navigationArray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; [navigationArray removeAllObjects]; self.navigationController.viewControllers = navigationArray;
希望这对你有用。