Сбой приложения при прокрутке таблицы - PullRequest
0 голосов
/ 23 июня 2011

В моем приложении у меня есть табличное представление, отображающее представление изображений, 4 представления изображений в одной строке. Моя проблема заключается в том, что после загрузки табличного представления с некоторыми данными, если я пытаюсь прокрутить табличное представление, то происходит сбой моего приложения. При использовании точки останова я обнаружил, что ячейка для строки в индексном пути вызывается снова, и мой массив пытается перезагрузить данные снова. Пожалуйста, помогите, так как сейчас у меня в голове, я отправляю свой код здесь: -

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = nil;



    static NSString *AutoCompleteRowIdentifier = @"AutoCompleteRowIdentifier";

    cell = [tableView dequeueReusableCellWithIdentifier:AutoCompleteRowIdentifier];

    if (cell == nil) {

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:AutoCompleteRowIdentifier] autorelease];


        UIImageView * imageView1 = [[[UIImageView alloc] initWithFrame:CGRectMake(25, 4, 70, 80)] autorelease];

        UIImageView * imageView2 = [[[UIImageView alloc] initWithFrame:CGRectMake(115,4,70, 80)] autorelease];

        UIImageView * imageView3 = [[[UIImageView alloc] initWithFrame:CGRectMake(205,4, 70, 80)] autorelease];

        UIImageView * imageView4 = [[[UIImageView alloc] initWithFrame:CGRectMake(295,4, 70, 80)] autorelease];

        UIImageView * imageView5 = [[[UIImageView alloc] initWithFrame:CGRectMake(25, 4, 70, 80)] autorelease];

        UIImageView * imageView6 = [[[UIImageView alloc] initWithFrame:CGRectMake(115,4,70, 80)] autorelease];

        UIImageView * imageView7 = [[[UIImageView alloc] initWithFrame:CGRectMake(205,4, 70, 80)] autorelease];

        UIImageView * imageView8 = [[[UIImageView alloc] initWithFrame:CGRectMake(295,4, 70, 80)] autorelease];

        UIImageView * imageView9 = [[[UIImageView alloc] initWithFrame:CGRectMake(25, 4, 70, 80)] autorelease];

        UIImageView * imageView10 = [[[UIImageView alloc] initWithFrame:CGRectMake(115,4,70, 80)] autorelease];

        UIImageView * imageView11 = [[[UIImageView alloc] initWithFrame:CGRectMake(205,4, 70, 80)] autorelease];

        UIImageView * imageView12 = [[[UIImageView alloc] initWithFrame:CGRectMake(295,4, 70, 80)] autorelease];



        imageView1.tag=1;
        imageView2.tag=2;
        imageView3.tag=3;
        imageView4.tag=4;
        imageView5.tag=5;
        imageView6.tag=6;
        imageView7.tag=7;
        imageView8.tag=8;
        imageView9.tag=9;
        imageView10.tag=10;
        imageView11.tag=11;
        imageView12.tag=12;



        if ([sentence count]>0) {

            [imageViewArray insertObject:imageView1 atIndex:0];

            [cell.contentView addSubview:imageView1];

        }

        if ([sentence count]>1) {

            [imageViewArray insertObject:imageView2 atIndex:1];

            [cell.contentView addSubview:imageView2];

        }

        if ([sentence count]>2) {

            [imageViewArray insertObject:imageView3 atIndex:2];

            [cell.contentView addSubview:imageView3];
        }

        if ([sentence count]>3) {

            [imageViewArray insertObject:imageView4 atIndex:3];

            [cell.contentView addSubview:imageView4];
        }
        if ([sentence count]>4) {
            [imageViewArray insertObject:imageView5 atIndex:4];

            [cell.contentView addSubview:imageView5];
        }
        if ([sentence count]>5) {
            [imageViewArray insertObject:imageView6 atIndex:5];

            [cell.contentView addSubview:imageView6];
        }
        if ([sentence count]>6) {
            [imageViewArray insertObject:imageView7 atIndex:6];

            [cell.contentView addSubview:imageView7];
        }
        if ([sentence count]>7) {
            [imageViewArray insertObject:imageView8 atIndex:7];

            [cell.contentView addSubview:imageView8];
        }
        if ([sentence count]>8) {
            [imageViewArray insertObject:imageView9 atIndex:8];

            [cell.contentView addSubview:imageView9];
        }
        if ([sentence count]>9) {
            [imageViewArray insertObject:imageView10 atIndex:9];

            [cell.contentView addSubview:imageView10];
        }
        if ([sentence count]>10) {
            [imageViewArray insertObject:imageView11 atIndex:10];

            [cell.contentView addSubview:imageView11];
        }
        if ([sentence count]>11 || ([sentence count]==12)) {
            [imageViewArray insertObject:imageView12 atIndex:11];

            [cell.contentView addSubview:imageView12];
        }

    }

        if ([sentence count]!=0) 
{


    int photosInRow;

        if ( (indexPath.row < 

[tableView numberOfRowsInSection:indexPath.section] - 1) || ([sentence count] % 4 == 0) ) {

        photosInRow = 4;

    } else {

        photosInRow = [sentence count] % 4;
    }


    for ( int i = 1; i <=photosInRow ; i++ ){

        imageView = (UIImageView *)[cell.contentView viewWithTag:j];

        [self setImage1:imageView];
        }

    }
        return cell;


}

Ответы [ 2 ]

1 голос
/ 23 июня 2011

Я считаю, что самая большая проблема здесь - утечка памяти для ваших изображений.Каждая ячейка создает 12 изображений, ни один из которых не освобождается.Похоже, вам нужно только создать нужные вам изображения (для скорости) и правильно их освободить (для управления памятью).

Один из способов переписать этот код - это следующее:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *AutoCompleteRowIdentifier = @"AutoCompleteRowIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:AutoCompleteRowIdentifier];

    if (!cell) {

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:AutoCompleteRowIdentifier] autorelease];

        for (int i=0; i <= [sentence count]; ++i) {
            UIImageView * imageView = [[[UIImageView alloc] initWithFrame:CGRectMake(25+90*(i%4), 4, 70, 80)] autorelease];
            imageView.tag = i+1;
            [cell.contentView addSubview:imageView];
            [imageView release];
        }
    }
    return cell;
}

Я не понимаю, почему вы устанавливаете imageViewArray или imageView1 повторно.Кроме того, эта строка:

   imageView = (UIImageView *)[cell.contentView viewWithTag:j];

не имеет смысла, поскольку j не определено.

0 голосов
/ 24 июня 2011

При использовании точки останова я обнаружил, что ячейка для строки в пути индекса снова вызывается, и мой массив пытается перезагрузить данные снова.

Это верно. Если вы этого не понимаете, вы не понимаете, как работает табличное представление. Ячейки создаются по требованию и используются повторно; одна и та же ячейка может использоваться снова и снова для разных строк таблицы при прокрутке пользователем. Это означает, что вы должны заранее подготовить все данные и просто получить их по требованию для любого запрошенного раздела / строки.

Другими словами, MVC: модель-представление-контроллер. Ваша модель - это ваши данные. tableView:cellForRowAtIndexPath: - вид; Вы не должны изменять модель во время этого, потому что, когда и как часто она вызывается, полностью зависит от потребностей представления.

Другое дело, что вы не должны создавать отдельный массив изображений. Просмотр изображения - это просмотр. Если вы хотите сохранить список чего-либо, сохраните список имен изображений или чего-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...