IndexOutOfBounds循环遍历子视图?

时间:2011-11-25 13:11:12

标签: objective-c ios indexoutofboundsexception

我有一个刷新UIScrollView内容的方法。在ScrollView中有几个UIImageViews和一些UILabel。

我使用以下代码清理scrollView的内容:

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

我无法理解这里发生了什么。我遍历子视图(计数应该给我现有子视图的数量!?)。为什么指数超出界限??

3 个答案:

答案 0 :(得分:1)

我怀疑这条线上会抛出异常:

if ([[publicationsScrollView.subviews objectAtIndex:i] isKindOfClass:[iCarousel class]]) {

[[publicationsScrollView.subviews objectAtIndex:i] removeFromSuperview]刚刚执行的情况下,将不再是索引'i'处的对象。只有当数组中的最后一个子视图是您删除的类型之一时才会发生这种情况 - 否则访问将是无害的。

要解决此问题,您只需在continue来电后添​​加removeFromSuperview即可。

答案 1 :(得分:0)

也许尝试使用快速枚举替换for循环,例如:

for (UIView *aView in publicationsScrollview.subviews) {

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

看看你是否有同样的行为。

答案 2 :(得分:0)

在第一个if中,如果输入则删除子视图。所以,你减少了子视图count数组。 在那之后你再次尝试进行子视图,在第二个if中,这个子视图被删除了,这就是它崩溃的原因。