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

Ton*_*ony 11 uiviewcontroller uinavigationcontroller viewcontroller navigationcontroller ios

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

现在我在堆栈A,B中.现在我想调用C(来自B).我希望堆栈是A,C.

谢谢.

Joh*_*hnK 23

在ARC的背景下,这是一个可能的解决方案:

NSMutableArray* navArray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers];
[navArray replaceObjectAtIndex:[navArray count]-1 withObject:nextViewController];
[self.navigationController setViewControllers:navArray animated:YES];
Run Code Online (Sandbox Code Playgroud)

正如您所知,此代码替换了您尝试从堆栈中删除的视图中的常用推送代码(在您的问题中为"B").第1行将视图控制器列表从导航控制器堆栈复制到NSMutableArray.第2行用我们想要转到下一个("C")的视图替换最后一个(最顶部)视图.第3行使实际的nav-controller的堆栈成为我们改变的数组,并动画转换到最顶层的项目.(当然你不能在root viewController中使用这个代码.)

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

UINavigationController *navController = self.navigationController;
[navController popViewControllerAnimated:NO];
[navController pushViewController:someViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

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


Ton*_*ony 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];
Run Code Online (Sandbox Code Playgroud)

这推动了新的:

ViewControllerC *viewC = [[ViewControllerC alloc] init];
[navController pushViewController:viewC animated:TRUE];
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!

  • 知道如何在启用ARC的情况下执行此操作吗?编译器不允许使用`retain` (2认同)