以编程方式从 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的主要内容,如果未能解决你的问题,请参考以下文章

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

iOS:从导航栏中删除以编程方式添加的搜索栏

如何以编程方式添加多个导航控制器?

如何以编程方式为非 ARC xcode 项目中的特定文件启用 ARC?

从导航堆栈中删除视图控制器

如何从模态堆栈优化方式(特定)中删除页面?