我如何从导航控制器中删除一个视图
我想调用一个新的视图控制器,并从导航控制器堆栈中删除当前的视图控制器。 例如。 我在视图控制器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;
希望这会为你工作。