【发布时间】:2011-12-21 14:24:38
【问题描述】:
我想调用一个新的视图控制器并从导航控制器堆栈中删除当前的视图控制器。 例如。我在视图控制器 A 中,我打电话给 B。
现在我在堆栈 A , B 中。 现在我想打电话给C(来自B)。 我希望堆栈为 A、C。
谢谢。
【问题讨论】:
标签: ios uiviewcontroller uinavigationcontroller viewcontroller navigationcontroller
我想调用一个新的视图控制器并从导航控制器堆栈中删除当前的视图控制器。 例如。我在视图控制器 A 中,我打电话给 B。
现在我在堆栈 A , B 中。 现在我想打电话给C(来自B)。 我希望堆栈为 A、C。
谢谢。
【问题讨论】:
标签: ios uiviewcontroller uinavigationcontroller viewcontroller navigationcontroller
在 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,而第三行将不起作用。行数与前一种方式相同,但这种方式通过内置方法工作,而不是“手动”摆弄堆栈。
【讨论】:
这就是答案。
以下代码弹出当前视图控制器。
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];
希望对你有帮助!
【讨论】:
retain
要删除倒数第二个导航项:
NSMutableArray *navigationStack = [[NSMutableArray alloc] initWithArray:
self.navigationController.viewControllers];
[navigationStack removeObjectAtIndex:[navigationStack count] - 2];
self.navigationController.viewControllers = navigationStack;
例如,在控制器 C 上从 viewDidLoad 运行此命令,以从导航堆栈中删除控制器 B。
【讨论】:
我认为您可以通过首先从导航堆栈中弹出 B 然后将 C 推入其中来做到这一点。您应该可以为此使用 [UINavigationController popViewControllerAnimated] 和 [UINavigationController pushViewController:animated]。
【讨论】:
您可以使用此代码。
NSMutableArray *navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers]; [navigationArray removeAllObjects]; self.navigationController.viewControllers = navigationArray;
希望这对你有用。
【讨论】: