2011-11-25 33 views
0

我有一個方法來刷新UIScrollView的內容。在ScrollView中有幾個UIImageViews和一些UILabels。IndexOutOfBounds通過子視圖循環?

我做清潔滾動視圖的內容與下面的代碼:

for (int i = [publicationsScrollView.subviews count] -1; i>=0; i--) { 
    NSLog(@"Deleting SubView: %@", [[publicationsScrollView.subviews objectAtIndex:i] class]); 
    if ([[publicationsScrollView.subviews objectAtIndex:i] isKindOfClass:[UIButton class]] || [[publicationsScrollView.subviews objectAtIndex:i] isKindOfClass:[UIButtonLongTap class]] || [[publicationsScrollView.subviews objectAtIndex:i] isKindOfClass:[UILabel class]] || [[publicationsScrollView.subviews objectAtIndex:i] isKindOfClass:[UIImageView class]]) { 
     NSLog(@"Deleting SubView: %@", [[publicationsScrollView.subviews objectAtIndex:i] class]); 
     [[publicationsScrollView.subviews objectAtIndex:i] removeFromSuperview]; 
    } 
    if ([[publicationsScrollView.subviews objectAtIndex:i] isKindOfClass:[iCarousel class]]) { 
     NSLog(@"carousel: View is in Scrollview"); 
    } 
} 

此代碼運行良好了一些日子。現在我在控制檯刷新期間收到一個錯誤:

refreshWorkSpace: deleting all subviews (11) 
2011-11-25 14:04:52.826 CatalogService[45054:fb03] Deleting SubView: UILabel 
2011-11-25 14:04:52.827 CatalogService[45054:fb03] Deleting SubView: UILabel 
2011-11-25 14:04:52.839 CatalogService[45054:fb03] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 10 beyond bounds [0 .. 9]' 
*** First throw call stack: 
(0x1e8c052 0x231fd0a 0x1e78db8 0x6945 0x5826 0x1e8dec9 0xddc5c2 0xddc55a 0xe81b76 0xe8203f 0xe81bab 0xecfa99 0xed1407 0xe0193f 0xe01c56 0xde8384 0xddbaa9 0x28b6fa9 0x1e601c5 0x1dc5022 0x1dc390a 0x1dc2db4 0x1dc2ccb 0x28b5879 0x28b593e 0xdd9a9b 0x2e6d 0x2de5 0x1 

我不明白這裏發生了什麼。我循環通過子視圖(計數應該給我現有子視圖的數量!?)。爲什麼指數會超出界限!

+0

這很奇怪。你確定子視圖不會被其他函數同時刪除嗎?你確定沒有其他的源代碼片段可以影響這個bug嗎? – Piotr

+0

我正在通過代碼爬行來檢查。到目前爲止我找不到任何東西。 – MadMaxAPP

+0

它總是在相同的子視圖上崩潰... – MadMaxAPP

回答

1

我會懷疑異常被拋出在這條線:

if ([[publicationsScrollView.subviews objectAtIndex:i] isKindOfClass:[iCarousel class]]) { 
[[publicationsScrollView.subviews objectAtIndex:i] removeFromSuperview]剛剛在那裏執行將不再索引「我」的對象的情況下

。這隻會發生在數組中最後一個子視圖是你刪除的類型之一的情況下 - 否則訪問將是無害的。

要解決此問題,您可以在removeFromSuperview調用後添加continue

+0

似乎工作。感謝您在這個基本問題上的幫助! – MadMaxAPP

0

也許嘗試用快速列舉替換for循環,如:

for (UIView *aView in publicationsScrollview.subviews) { 

    .... rewrite code to reference aView instead of using objectAtIndex 
} 

,看看你會得到相同的行爲。

+0

它只是怪我,你說,它崩潰的I = 3,但是崩潰日誌似乎暗示其超出其範圍爲I = 10 – Damien

+0

他通過移除子視圖修改子視圖數組,所以快速列舉將拋出有關異常在迭代過程中突變數組。 – JosephH

+0

@JoesphH - 好趕上! – Damien

0

在第一個如果,如果它進入你刪除子視圖。所以,你減少了子視圖count數組。 之後,你再次嘗試採取子視圖,在第二個,如果這個子視圖被刪除,這就是爲什麼它崩潰。