ячейка tableview загружает все сразу в iphone - PullRequest
0 голосов
/ 18 сентября 2009

Я реализовал следующий код в моем приложении.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    
NSString *CellIdentifier = [NSString stringWithFormat:@"%@%i",searchQueryString,indexPath.row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    XML_SearchResult *t=[arrayResults objectAtIndex:indexPath.row];
    cell=((indexPath.row%2)==0) ? 
        [self getCellContentView:CellIdentifier drillTitle:t.drill_title stroke_type:t.stroke_type exercise_type:t.exercise_type level_name:t.level_name age_range:t.age_range alterNate:NO] :
        [self getCellContentView:CellIdentifier drillTitle:t.drill_title stroke_type:t.stroke_type exercise_type:t.exercise_type level_name:t.level_name age_range:t.age_range alterNate:YES] ;
    CGRect a=[cell frame];
    UIImageView *bImg=[[UIImageView alloc] initWithFrame:a];
    bImg.image=[UIImage imageNamed:@"white-rect-tab-3.png"];
    [bImg setContentMode:UIViewContentModeScaleToFill]; 
    cell.selectedBackgroundView=bImg; [bImg release];
}
return cell;
}
-(UITableViewCell*)getCellContentView:(NSString*)cellIdentifier drillTitle:(NSString*)drillTitle stroke_type:(NSString*)stroke_type exercise_type:(NSString*)exercise_type level_name:(NSString*)level_name age_range:(NSString*)age_range alterNate:(BOOL)alterNate
{
CGRect label1Frame=CGRectMake(5, 20, 260, 32),label2Frame=CGRectMake(5, 62, 120, 30),label3Frame=CGRectMake(130, 62, 170, 30);//,BgFrame=CGRectMake(0, 0, 320, 60);
UITableViewCell *cell=[[[UITableViewCell alloc] initWithFrame:CGRectMake(0, 0, 312, 95) reuseIdentifier:cellIdentifier] autorelease];
UILabel *tmp; UIImageView *imgBg;
cell.backgroundColor=[UIColor clearColor];
// drill title label
tmp=[[UILabel alloc] initWithFrame:CGRectMake(5, 1, 260, 32)]; 
tmp.textColor=[UIColor colorWithRed:(9.0/255.0) green:(68.0/255) blue:(85.0/255) alpha:1.0];
[tmp setFont:[UIFont fontWithName:@"ArialRoundedMTBold" size:18]];  tmp.text=drillTitle; [tmp setShadowColor:[UIColor lightGrayColor]];
tmp.backgroundColor=[UIColor clearColor]; [cell.contentView addSubview:tmp]; [tmp release]; 
// title label - tip
tmp=[[UILabel alloc] initWithFrame:label1Frame]; 
tmp.textColor=[UIColor colorWithRed:(9.0/255.0) green:(68.0/255) blue:(85.0/255) alpha:1.0];
[tmp setFont:[UIFont fontWithName:@"ArialRoundedMTBold" size:18]];  tmp.text=stroke_type; [tmp setShadowColor:[UIColor lightGrayColor]];
tmp.backgroundColor=[UIColor clearColor]; [cell.contentView addSubview:tmp]; [tmp release];
// sub title - exercise type label - tip
tmp=[[UILabel alloc] initWithFrame:CGRectMake(5, 40 , 260, 32)]; 
tmp.textColor=[UIColor colorWithRed:(14.0/255.0) green:(105.0/255) blue:(128.0/255) alpha:1.0];
[tmp setFont:[UIFont fontWithName:@"ArialRoundedMTBold" size:15]]; tmp.text=exercise_type; [tmp setShadowColor:[UIColor lightGrayColor]];
tmp.backgroundColor=[UIColor clearColor]; [cell.contentView addSubview:tmp]; [tmp release];
// Age - Range 
tmp=[[UILabel alloc] initWithFrame:label2Frame]; tmp.adjustsFontSizeToFitWidth=0; tmp.text=[NSString stringWithFormat:@"Age Range : %@",age_range];
tmp.textColor= [UIColor blackColor];//[UIColor colorWithRed:(14.0/255.0) green:(105.0/255) blue:(128.0/255) alpha:1.0];// : [UIColor blackColor] ;
[tmp setBackgroundColor:[UIColor clearColor]];
[tmp setFont:[UIFont fontWithName:@"ArialMT" size:14]]; [tmp setShadowOffset:CGSizeMake(1,1)]; [tmp setShadowColor:[UIColor lightGrayColor]];
[cell.contentView addSubview:tmp]; [tmp release];
// Difficulty leve - Range 
tmp=[[UILabel alloc] initWithFrame:label3Frame]; tmp.adjustsFontSizeToFitWidth=0; tmp.text=[NSString stringWithFormat:@"| Diff. Level : %@",level_name];
tmp.textColor=[UIColor blackColor];//[UIColor colorWithRed:(14.0/255.0) green:(105.0/255) blue:(128.0/255) alpha:1.0]; 
[tmp setShadowColor:[UIColor lightGrayColor]];
[tmp setBackgroundColor:[UIColor clearColor]];
[tmp setFont:[UIFont fontWithName:@"ArialMT" size:14]]; [tmp setShadowOffset:CGSizeMake(1,1)];
[cell.contentView addSubview:tmp]; [tmp release];
// arrow
imgBg=[[UIImageView alloc] initWithFrame:CGRectMake(280, 35, 13, 13)];  imgBg.contentMode=UIViewContentModeScaleToFill;
imgBg.image=[UIImage imageNamed:@"arrow-2.png"];
[cell.contentView addSubview:imgBg]; [cell.contentView sendSubviewToBack:imgBg]; [imgBg release]; 
// line
imgBg=[[UIImageView alloc] initWithFrame:CGRectMake(-4, 94, 298, 2)];  imgBg.contentMode=UIViewContentModeScaleToFill;
imgBg.image=[UIImage imageNamed:@"line.png"];
[cell.contentView addSubview:imgBg]; [cell.contentView sendSubviewToBack:imgBg]; [imgBg release]; 
[cell setSelectionStyle:UITableViewCellSelectionStyleGray];
return cell;
}

Это все о динамической настройке ячейки.

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

Какое решение для этого?

Ответы [ 2 ]

2 голосов
/ 18 сентября 2009

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

Вместо взлома, подобного этому, работайте над улучшением производительности вашей функции cellForIndexPath, чтобы она быстрее загружалась. Или асинхронно.

1 голос
/ 18 сентября 2009

Вероятно, загрузка изображения занимает все время. Создание ячеек не должно занимать много времени, особенно если вы повторно используете старые. Если изображения часто совпадают, вы можете их кэшировать. Кроме того, масштабирование занимает много времени, а также, если изображения не в формате PNG, они будут загружаться дольше. Но решением для меня было не загружать изображения при создании ячейки, т.е. НЕ в:

tableView:cellForRowAtIndexPath:

но вместо этого реализовать:

scrollViewDidEndDecelerating

Это функция делегата, которая вызывается, когда таблица перестает прокручиваться. Затем вы можете получить список видимых ячеек (indexPathsForVisibleRows) и установить изображение для каждой из них.

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