我想调用一个新的视图控制器,并从导航控制器堆栈中移除当前的视图控制器。
例如,我在A视图控制器中,然后我调用B。
现在,我的堆栈是A和B。 现在我想调用C(从B开始)。 我希望堆栈变成A,C。
谢谢。
现在,我的堆栈是A和B。 现在我想调用C(从B开始)。 我希望堆栈变成A,C。
谢谢。
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行使实际的导航控制器堆栈成为我们修改后的数组,并动画地转换到最上面的项目。(当然您不能在根视图控制器中使用此代码。)
我在这里找到了一种替代方法,并将其适用于ARC:
UINavigationController *navController = self.navigationController;
[navController popViewControllerAnimated:NO];
[navController pushViewController:someViewController animated:YES];
需要第一行是因为一旦弹出当前视图堆栈,self.navigationController
将会变成nil
,而第三行将无法工作。虽然与之前的方法有相同数量的行,但这种方式是通过内置方法来实现的,而不是通过“手动”调整堆栈。
这是答案。
下面的代码将弹出当前视图控制器。
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];
retain
。 - Hayley要删除倒数第二个导航项:
NSMutableArray *navigationStack = [[NSMutableArray alloc] initWithArray:
self.navigationController.viewControllers];
[navigationStack removeObjectAtIndex:[navigationStack count] - 2];
self.navigationController.viewControllers = navigationStack;
viewDidLoad
方法中运行以下代码以从导航栈中移除控制器B。我认为你可以通过先从导航栈中弹出B,然后将C推入其中来实现这一点。你应该能够使用[UINavigationController popViewControllerAnimated]和[UINavigationController pushViewController:animated]来完成这个操作。