如何从导航控制器中移除一个视图?

11
我想调用一个新的视图控制器,并从导航控制器堆栈中移除当前的视图控制器。 例如,我在A视图控制器中,然后我调用B。
现在,我的堆栈是A和B。 现在我想调用C(从B开始)。 我希望堆栈变成A,C。
谢谢。
5个回答

22
在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行使实际的导航控制器堆栈成为我们修改后的数组,并动画地转换到最上面的项目。(当然您不能在根视图控制器中使用此代码。)

我在这里找到了一种替代方法,并将其适用于ARC:

UINavigationController *navController = self.navigationController;
[navController popViewControllerAnimated:NO];
[navController pushViewController:someViewController animated:YES];

需要第一行是因为一旦弹出当前视图堆栈,self.navigationController将会变成nil,而第三行将无法工作。虽然与之前的方法有相同数量的行,但这种方式是通过内置方法来实现的,而不是通过“手动”调整堆栈。


谢谢,你的第二个实现正是我所需要的。 - NMunro

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
有没有想法如何在启用ARC的情况下完成这个?编译器不允许使用retain - Hayley

4

要删除倒数第二个导航项:

NSMutableArray *navigationStack = [[NSMutableArray alloc] initWithArray: 
    self.navigationController.viewControllers];
[navigationStack removeObjectAtIndex:[navigationStack count] - 2];
self.navigationController.viewControllers = navigationStack;

例如,在控制器C的viewDidLoad方法中运行以下代码以从导航栈中移除控制器B。

0

我认为你可以通过先从导航栈中弹出B,然后将C推入其中来实现这一点。你应该能够使用[UINavigationController popViewControllerAnimated]和[UINavigationController pushViewController:animated]来完成这个操作。


这是正确的,但不完整。我最终让它工作了,但在弹出控制器之前必须保留控制器,以便之后可以推入其他视图。UINavigationController *navController = self.navigationController; [[self retain] autorelease]; [navController popViewControllerAnimated:NO]; - Tony
根据苹果参考文献,http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html UINavigationController 不打算被子类化。为什么一些看似简单的东西却如此复杂呢? - Tony
@Tony 对不起,我忘记了。请忽略我的先前评论并进行编辑。我会将它们全部删除... - barley

-2
你可以使用这段代码:
NSMutableArray *navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers]; [navigationArray removeAllObjects]; self.navigationController.viewControllers = navigationArray;
希望对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接