0

我有一个刷新 UIScrollView 内容的网络。在 ScrollView 中有几个 UIImageView 和一些 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

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

4

3 回答 3

1

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

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

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

要修复,您可以在通话continue后添加一个。removeFromSuperview

于 2011-11-25T15:42:01.057 回答
0

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

for (UIView *aView in publicationsScrollview.subviews) {

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

看看你是否得到相同的行为。

于 2011-11-25T15:34:35.880 回答
0

在第一个 if 中,如果它进入,则删除子视图。因此,您减少了子视图计数数组。之后,您再次尝试获取子视图,在第二个 if 中,并且该子视图已被删除,这就是它崩溃的原因。

于 2011-11-25T15:41:31.157 回答