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

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

现在我已经在堆栈A,B了。现在我想打电话给C(从B)。 我想堆栈是A,C

谢谢。

在ARC的情况下,这是一个可能的解决scheme:

NSMutableArray* navArray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; [navArray replaceObjectAtIndex:[navArray count]-1 withObject:nextViewController]; [self.navigationController setViewControllers:navArray animated:YES]; 

正如你所看到的,这段代码replace了你想要从堆栈中删除的视图中通常的推送代码(在你的问题中是“B”)。 第1行将视图控制器的列表从nav-controller堆栈复制到NSMutableArray 。 第2行用我们想要转到下一个(“C”)的视图replace最后一个(最上面的)视图。 第3行使得实际的导航控制器的堆栈成为我们改变的数组,并且将过渡animation到最上面的项目。 (当然,你不能在root viewController中使用这个代码。)

我在这里find了一种替代方法,并将其改编为ARC:

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

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

这是答案。

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

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

希望能帮助到你!

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

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

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

我想你可以这样做,首先从导航栈中popupB,然后将C推入。 你应该可以使用[UINavigationController popViewControllerAnimated]和[UINavigationController pushViewController:animated]。

你可以使用这个代码。

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

希望这会为你工作。