2010-01-11 162 views
0

谁能告诉我为什么这个比较不断让我的应用程序冻结和崩溃?导航堆栈监控

NSArray *viewControllerArray = [controlFromMap.navigationController viewControllers]; 
NSUInteger parentViewControllerIndex = [viewControllerArray count] - 3 // or - whatever; 
NSLog(@"Parent view controller: %@", [viewControllerArray objectAtIndex:parentViewControllerIndex]); 



if([[[viewControllerArray objectAtIndex:parentViewControllerIndex]stringValue] isEqualToString: @"FromAddressController"]){ 

    _mapView.showsUserLocation = NO; 
} 
else{ 

_mapView.showsUserLocation = YES; 
} 
+0

我试图监控导航堆栈来决定显示的地图,它是什么。 NSLog输出控制器的名称,这就是我想要比较的。 – Makinitez21 2010-01-11 10:58:03

回答

1

[viewControllerArray objectAtIndex:parentViewControllerIndex]应该返回一个UIViewController子类的实例。确保它响应-stringValue或(假设FromAddressController是一个类名),使它这样:

if([[viewControllerArray objectAtIndex:parentViewControllerIndex] class] == [FromAddressController class]) 
+0

对,它确实返回了这个值,但是从我看到它不响应字符串值。 – Makinitez21 2010-01-11 11:21:32

1

如果添加:

NSLog(@"parentViewControllerIndex: %d", parentViewControllerIndex); 

行后:

NSUInteger parentViewControllerIndex = [viewControllerArray count] - 3; 

你在控制台中看到什么样的价值?

+0

73793360,那个数字显示出那个特定的控制器堆栈 – Makinitez21 2010-01-11 11:04:42

+0

你正在使用'NSUInteger',它是无符号的。一个带符号的整数是负数的,当它被做成无符号时,它将被包裹起来,你会得到一个大的整数结果,就像你看到的一样。这意味着你在'viewControllerArray'上得到了一个越​​界错误 - 你试图引用这个不存在的数组元素。也许你不应该从你的计数中减去3,而是少一些。 – 2010-01-11 11:07:43

0

另外,该线路:

if([[[viewControllerArray objectAtIndex:parentViewControllerIndex]stringValue] isEqualToString: @"FromAddressController"]){ 

看起来可疑我。

我检查了documentationUIViewController类似乎没有-stringValue方法。所以你可能会得到一个无法识别的选择器异常,你的应用程序会崩溃。

也许你的意思是nibName而不是stringValue

+0

好吧,我试过nibName,但那个不起作用,因为它们在相同的nib文件中。我想我必须去看别的东西去比较 – Makinitez21 2010-01-11 11:13:47

+0

你可以看看Costique建议的'class',但是如果你想引用viewControllerArray的第73793360个元素,你肯定会遇到一个越界会导致应用程序崩溃的异常,无论您是使用'class'还是'nibName',因为您的导航堆栈中不会有73793360+个视图控制器。 – 2010-01-11 11:17:26

+0

对我得到你,这是一个下溢问题。我会更深入地看看这个班级。谢谢 – Makinitez21 2010-01-11 11:20:08