Проблемы с прокруткой UITableView - PullRequest
0 голосов
/ 03 августа 2011

В моем приложении я использую табличное представление для отображения изображений. Я отображаю 4 изображения подряд. Я могу отображать изображения красиво. Но моя проблема в том, что когда я прокручиваю табличное представление для просмотра изображений, топрокрутка происходит с очень низкой скоростью, а также между ними. Это может быть причиной. Я публикую свою часть кода здесь, пожалуйста, помогите.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    NSLog([NSString stringWithFormat:@" numberOfRowsInSection :%d",(int)ceil([wordsInSentence count]/4.0)]);
    buttonIndex=1;

    return (int)ceil([wordsInSentence count]/4.0);
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell!=nil) {
      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
      //return cell;

    }
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    for (int i=0; i < 4; i++) {
      UIImageView *importMediaSaveImage;
      NSString *name1;
      NSString *name2;
      NSString *name3;
      NSString *name4;

      switch (i) {

       case 0:
        importMediaSaveImage = [[[UIImageView alloc] initWithFrame:CGRectMake(25+90*(i%4), 6, 85, 125)] autorelease] ;
        if([wordsInSentence count]>((indexPath.row * 4)+ 0)){

           name1= [wordsInSentence objectAtIndex:((indexPath.row * 4)+ 0)]; 

           importMediaSaveImage.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:name1 ofType:@"png" inDirectory:@"Images"]];
           buttonIndex=((indexPath.row * 4)+ 0)+1;
           [self showImage:importMediaSaveImage];
           [imageViewArray addObject:importMediaSaveImage];
           [cell.contentView addSubview:importMediaSaveImage];  
           [imageCollection addObject:importMediaSaveImage];
           NSLog(name1);
        } else {
           importMediaSaveImage.image=[UIImage imageNamed:@"White.png"];
           //importMediaSaveImage.image = nil;
           [cell.contentView setHidden:YES];
        }

        break;

      case 1:
        importMediaSaveImage = [[[UIImageView alloc] initWithFrame:CGRectMake(25+90*(i%4), 6, 85, 125)] autorelease] ;
        if([wordsInSentence count]>((indexPath.row * 4)+ 1)){
          name2 = [wordsInSentence objectAtIndex:((indexPath.row * 4)+ 1)];     
          NSLog(name2);
          importMediaSaveImage.image  = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:name2 ofType:@"png" inDirectory:@"Images"]];
          [cell.contentView addSubview:importMediaSaveImage];
          buttonIndex=((indexPath.row * 4)+ 1)+1;
          [self showImage:importMediaSaveImage];
          [imageViewArray addObject:importMediaSaveImage];
          [imageCollection addObject:importMediaSaveImage];
        } else {
          importMediaSaveImage.image=[UIImage imageNamed:@"White.png"];
          //importMediaSaveImage.image = nil;
          [cell.contentView addSubview:importMediaSaveImage];
        }
     break;

    case 2:
        importMediaSaveImage = [[[UIImageView alloc] initWithFrame:CGRectMake(25+90*(i%4), 6, 85, 125)] autorelease] ;
        if([wordsInSentence count]>((indexPath.row * 4)+ 2)){
          name3 = [wordsInSentence objectAtIndex:((indexPath.row * 4)+ 2)]; 
          NSLog(name3);
          importMediaSaveImage.image  = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:name3 ofType:@"png" inDirectory:@"Images"]];
          [cell.contentView addSubview:importMediaSaveImage];
          buttonIndex=((indexPath.row * 4)+ 2)+1;
          [self showImage:importMediaSaveImage];
          [imageViewArray addObject:importMediaSaveImage];
          [imageCollection addObject:importMediaSaveImage];
        } else {
          importMediaSaveImage.image=[UIImage imageNamed:@"White.png"];
          //importMediaSaveImage.image = nil;
          [cell.contentView addSubview:importMediaSaveImage];
        }
        break;

    case 3:
        importMediaSaveImage = [[[UIImageView alloc] initWithFrame:CGRectMake(25+90*(i%4), 6, 85, 125)] autorelease] ;
        if([wordsInSentence count]>((indexPath.row * 4)+ 3)){
          [cell.contentView addSubview:importMediaSaveImage];   
          name4 = [wordsInSentence objectAtIndex:((indexPath.row * 4)+ 3)];
          NSLog(name4);
          importMediaSaveImage.image  = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:name4 ofType:@"png" inDirectory:@"Images"]];
          buttonIndex=((indexPath.row * 4)+ 3)+1;
          [self showImage:importMediaSaveImage];
          [imageViewArray addObject:importMediaSaveImage];
          [imageCollection addObject:importMediaSaveImage];
        } else {
          importMediaSaveImage.image=[UIImage imageNamed:@"White.png"];
          //importMediaSaveImage.image = nil;
          [cell.contentView addSubview:importMediaSaveImage];
        }
        break;

    } //switch end
  } //for loop end

  return cell;
}

1 Ответ

1 голос
/ 03 августа 2011

Самая большая проблема у вас заключается в том, что вы выполняете весь рендеринг внутри метода -cellForRowAtIndexPath. Это прекрасно работает для текста и быстро повторяющихся данных, но для изображений или данных, загружаемых из Интернета, это ужасно неэффективно.

Имейте в виду, этот метод вызывается один раз для каждой видимой на экране ячейки. Так что, если у вас много работы с процессором, это приведет к задержке или сбою прокрутки.

Вы должны прочитать эту статью на Быстрая прокрутка , написанная Лорен Брихтер из Tweetie Fame. Он объясняет, как добиться быстрой прокрутки из таблицы с большим количеством информации. Он немного устарел для iOS 4, так как некоторые методы изменились, но он достаточно близок, чтобы вы могли двигаться в правильном направлении.

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