2012-04-30 23 views
1

我有要求删除堆栈中的前一个视图控制器。我已经成功地使用在过去这种方法,没有任何问题:为什么我的UINavigationController在发布配置上崩溃?

NSMutableArray *vcs = [NSMutableArray arrayWithArray:self.navigationController.viewControllers]; 
    BOOL removedFlag = YES; 
    while (removedFlag == YES) 
    { 
     removedFlag = NO; 
     for (UIViewController *vc in vcs) 
     { 
      if(![vc isKindOfClass:[self class]] && ![vc isKindOfClass:[MenuVC class]]) 
      { 
       [vcs removeObject:vc]; 
       removedFlag = YES; 
       break; 
      } 
     } 
    } 
    [self.navigationController setViewControllers:[NSArray arrayWithArray:vcs]]; 

现在我更新的应用程序,它神秘崩溃上发布配置,而不是调试。另外,在调试模式下不会有任何警告。我认为SDK发生了一些变化。它从来没有这样做过。

我提供的示例项目: http://dl.dropbox.com/u/7834263/RemoveTest.zip

这是启用了ARC-项目。

回答

1

第一行实际上应该是:

NSMutableArray *vcs = [self.navigationController.viewControllers mutableCopy]; 

的NSMutableArray是NSArray中的一个子类。 arrayWithArray是NSArray类的一个方法 - 它创建一个不可变数组。 mutableCopy方法创建原始数组的可变副本。你永远不会真的应该能够在你的vcs数组上调用removeObject,因为它实际上从来不是一个NSMutableArray - 它是一个NSArray。

+0

这工作,但为什么呢?两个数组都不能持有对象的引用吗? – TigerCoding

+0

我用解释更新了我的答案。 –

+0

=奇怪我从来没有遇到过这个问题。删除后(在我上面的代码中)检查vcs数组的内容时,它只显示两个视图控制器,因此它将删除它们。 – TigerCoding

0

一个简单的方法来删除以前的viewController在栈可能是:

int vcIdx=[self.navigationController.viewControllers indexOfObject:self]-1; 
NSMutableArray *vControllers = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; 
[vControllers removeObjectAtIndex:vcIdx]; 
self.navigationController.viewControllers=vControllers; 
+0

我实际上在我的项目中删除了多个控制器,但我没有详细说明。是的,这是更好。 – TigerCoding

+0

哦,我以为你的要求是要删除以前的控制器:) – Mat