如何从导航控制器中删除视图

Posted

技术标签:

【中文标题】如何从导航控制器中删除视图【英文标题】:How can I remove a view from navigation controller 【发布时间】:2011-12-21 14:24:38 【问题描述】:

我想调用一个新的视图控制器并从导航控制器堆栈中删除当前的视图控制器。 例如。我在视图控制器 A 中,我打电话给 B。

现在我在堆栈 A , B 中。 现在我想打电话给C(来自B)。 我希望堆栈为 A、C。

谢谢。

【问题讨论】:

【参考方案1】:

在 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 行使实际导航控制器的堆栈成为我们更改的数组,并动画过渡到最顶部的项目。 (当然不能在根viewController中使用这段代码。)

我找到了另一种方法 here 并将其改编为 ARC:

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

第一行是必需的,因为一旦您将当前视图从堆栈中弹出,self.navigationController 将是nil,而第三行将不起作用。行数与前一种方式相同,但这种方式通过内置方法工作,而不是“手动”摆弄堆栈。

【讨论】:

感谢您的第二次实现正是我想要的。【参考方案2】:

这就是答案。

以下代码弹出当前视图控制器。

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

希望对你有帮助!

【讨论】:

知道如何在启用 ARC 的情况下执行此操作吗?编译器不允许使用retain【参考方案3】:

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

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

例如,在控制器 C 上从 viewDidLoad 运行此命令,以从导航堆栈中删除控制器 B。

【讨论】:

【参考方案4】:

我认为您可以通过首先从导航堆栈中弹出 B 然后将 C 推入其中来做到这一点。您应该可以为此使用 [UINavigationController popViewControllerAnimated] 和 [UINavigationController pushViewController:animated]。

【讨论】:

这是正确的,但不完整。我终于让它工作了,但我必须在弹出它之前保留控制器,所以我可以在之后推送另一个视图。 UINavigationController *navController = self.navigationController; [[自我保留]自动释放]; [navController popViewControllerAnimated:NO]; 根据 Apple 参考,developer.apple.com/library/ios/#documentation/uikit/reference/…UINavigationController 不打算被子类化。为什么这么简单的事情这么复杂? @Tony 我的错,我忘记了。忽略我之前的评论和编辑。我会将它们全部删除...【参考方案5】:

您可以使用此代码。

NSMutableArray *navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers]; [navigationArray removeAllObjects]; self.navigationController.viewControllers = navigationArray;

希望这对你有用。

【讨论】:

以上是关于如何从导航控制器中删除视图的主要内容,如果未能解决你的问题,请参考以下文章

从导航堆栈中删除视图控制器

如果使用导航控制器,如何删除某些片段中的底部导航视图和工具栏?

iOS UINavigationController - 从导航堆栈中删除视图控制器确实会释放它

斯威夫特/iOS。从导航堆栈中删除几个视图控制器

Ios 导航 - 自定义后退按钮或从堆栈中删除视图控制器?

如何从导航栏中删除 UIPageControl?