为什么我的UINavigationController在发布配置上崩溃?
我有要求删除堆栈中的前一个视图控制器。我已经成功地使用在过去这种方法,没有任何问题:为什么我的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-项目。
第一行实际上应该是:
NSMutableArray *vcs = [self.navigationController.viewControllers mutableCopy];
的NSMutableArray是NSArray中的一个子类。 arrayWithArray
是NSArray类的一个方法 - 它创建一个不可变数组。 mutableCopy
方法创建原始数组的可变副本。你永远不会真的应该能够在你的vcs数组上调用removeObject
,因为它实际上从来不是一个NSMutableArray - 它是一个NSArray。
一个简单的方法来删除以前的viewController在栈可能是:
int vcIdx=[self.navigationController.viewControllers indexOfObject:self]-1;
NSMutableArray *vControllers = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers];
[vControllers removeObjectAtIndex:vcIdx];
self.navigationController.viewControllers=vControllers;
我实际上在我的项目中删除了多个控制器,但我没有详细说明。是的,这是更好。 – TigerCoding
哦,我以为你的要求是要删除以前的控制器:) – Mat
这工作,但为什么呢?两个数组都不能持有对象的引用吗? – TigerCoding
我用解释更新了我的答案。 –
=奇怪我从来没有遇到过这个问题。删除后(在我上面的代码中)检查vcs数组的内容时,它只显示两个视图控制器,因此它将删除它们。 – TigerCoding