以编程方式从 ARC 中的导航堆栈中删除 viewController
Posted
技术标签:
【中文标题】以编程方式从 ARC 中的导航堆栈中删除 viewController【英文标题】:Removing the viewController programmatically from the navigation stack in ARC 【发布时间】:2012-12-04 11:16:52 【问题描述】:我想在推送第三个新的 ViewController 之前清除我的导航堆栈,它有两个视图控制器。我正在执行以下操作:
NSMutableArray *viewControllerArray=[[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers];
for (int i = 0; i < [viewControllerArray count]; i++)
[viewControllerArray removeObjectAtIndex:i];
//here the [viewControllerArray count] is 2,but loop is iterated only once.
self.navigationController.viewControllers=viewControllerArray;
NSLog(@"View Controller Array %@",[self.navigationController viewControllers])
//This will print null which I assume is correct.
然后我按如下方式推送新的 ViewController:
DetailViewController *detailView=[[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
[self.navigationController pushViewController:detailView animated:YES];
但是我的新视图没有被推送,而是显示在导航堆栈中的最顶层视图。我觉得这很奇怪,因为,我已经删除了 ViewControllers 并在 NSLog 中打印它,它显示为 null。
【问题讨论】:
【参考方案1】:DetailViewController *detailView = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
NSMutableArray *viewControllerArray = [self.navigationController.viewControllers mutableCopy];
[viewControllerArray removeAllObjects];
[viewControllerArray addObject:detailView];
[self.navigationController setViewControllers:viewControllerArray animated:YES];
试试这个。
【讨论】:
【参考方案2】:尝试在推送第三个视图之前删除一个视图控制器,并从第三个视图控制器中删除第二个视图控制器。使用循环删除多个 viewController 有时可能会导致错误。
【讨论】:
如果我在 DetailViewController 中执行此操作,[viewControllerArray removeObjectAtIndex:i] 也会删除 DetailViewController 在我的答案中检查 for 循环中的条件。它是 [viewControllerArray 计数]-1 如果它不起作用,请尝试在推送第三个视图之前删除一个视图控制器,并从第三个视图控制器中删除第二个视图控制器。使用循环删除多个 viewController 有时可能会导致错误。我不知道为什么。 你是对的。使用循环删除多个视图控制器不会提供预期的结果。它真的很奇怪。感谢您的帮助:)。我一直在苦苦挣扎。请在答案中添加您的评论,以便我接受。 从 DetailViewController 类的堆栈中删除以前的 viewController 没有任何区别。由于第二部分,我接受了它以上是关于以编程方式从 ARC 中的导航堆栈中删除 viewController的主要内容,如果未能解决你的问题,请参考以下文章