2010-01-11 211 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