tableview单元格在iphone中一次加载

时间:2009-09-17 22:26:21

标签: iphone xcode uitableview

我已在我的应用程序中实现了以下代码。

-(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;
}

这就是动态定制单元格。

但问题是 - 第一次只创建可见单元格,然后 - 用户尝试向下滚动。将要创建其他可见的细胞。然后显示。因此,第一次滚动tableview会有一些延迟。

这是什么解决方案?

2 个答案:

答案 0 :(得分:2)

在开发移动平台时,您需要关注内存占用。我觉得如果你试图同时加载400个带有图像的单元格,你可能会遇到麻烦。这不是推荐的方法,你肯定会在加载时引入很大的延迟。

而不是像这样的黑客攻击,努力提高cellForIndexPath函数的性能,使其加载速度更快。或者是异步的。

答案 1 :(得分:1)

这可能是一直需要的图像加载。创建单元格不应该花很长时间,特别是如果重用旧单元格。 如果图像通常是相同的,那么您可以缓存这些图像。缩放也需要时间,如果图像不是PNG,则加载时间也会更长。 但我的解决方案是在创建单元格时不加载图像,即不在:

tableView:cellForRowAtIndexPath:

但是实现:

scrollViewDidEndDecelerating

这是一个委托函数,在表停止滚动时调用。然后,您可以获得可见单元格的列表(indexPathsForVisibleRows)并在每个单元格上设置图像。