IndexOutOfBounds зацикливание хотя подпредставлений? - PullRequest
0 голосов
/ 25 ноября 2011

У меня есть nethod для обновления содержимого UIScrollView.В ScrollView есть несколько UIImageViews и несколько UILabels.

Я очищаю содержимое 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

Я не могу понять, что здесь происходит.Я перебираю подпредставления (count должен дать мне количество существующих подпредставлений!?).Почему индекс может выйти за пределы!?

Ответы [ 3 ]

1 голос
/ 25 ноября 2011

Я подозреваю, что в этой строке выдается исключение:

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

в случае, когда [[publicationsScrollView.subviews objectAtIndex:i] removeFromSuperview] только что выполнил, больше не будет объекта с индексом 'i'. Это произойдет только в том случае, если последнее подпредставление в массиве относится к одному из типов, которые вы удаляете, иначе доступ был бы безвредным.

Чтобы исправить, вы можете просто добавить continue после вызова removeFromSuperview.

0 голосов
/ 25 ноября 2011

В первом случае, если он введен, вы удалите подпредставление. Итак, вы уменьшили массив подсчетов. После этого вы пытаетесь снова взять подпредставление, во втором if, и это подпредставление было удалено, поэтому оно терпит крах.

0 голосов
/ 25 ноября 2011

Возможно, попробуйте заменить цикл более быстрым перечислением, например:

for (UIView *aView in publicationsScrollview.subviews) {

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

, и посмотрите, получите ли вы то же поведение.

...