1

我将尝试用 2 种不同的单元格实现 TableView,第一个是更高的单元格,里面有一个全角图像,所有其他单元格在左侧都有一个小拇指图像。

我的问题是 TableView 的性能。如果我滚动一个可能有 20 个项目的列表,它会有点抽搐。我已经为性能添加了一些东西,我希望代码不会那么糟糕:

  1. “不需要缓存图像来提高性能”是这样吗?
  2. 我是否以正确的方式重用单元格。
  3. 这是使用两种不同细胞的正常方式吗?

这是重要的部分:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0 && indexPath.row == 0) {
        return 160;
    }
    return 60;
}

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

    NSString *cellName = [[NSString alloc] init];

    // [...]

    if(indexPath.section == 0 && indexPath.row == 0){
        cellName = @"FirstMainCell";
        CellTemplateFirstNews *cell = [tableView dequeueReusableCellWithIdentifier:cellName];
        if(cell == nil){
            cell = [[[NSBundle mainBundle] loadNibNamed:@"CellTemplateFirstNewsView" owner:nil options:nil] objectAtIndex:0];
        }

        NSURL *urlRowImage = [NSURL URLWithString:[[NSString alloc]initWithFormat:@"http://webserver.de/inhalte/news/title/%@", detailDataNews.title_picture]];
        NSData *dataRowImage = [NSData dataWithContentsOfURL:urlRowImage];
        UIImageView *firstNewsImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 160)];
        firstNewsImageView.backgroundColor = [UIColor clearColor];
        firstNewsImageView.opaque = NO;
        firstNewsImageView.image = [UIImage imageWithData:dataRowImage];
        cell.backgroundView = firstNewsImageView;

        // [...]

        return cell;
    }else{
        cellName = @"MainCell";
        CellTemplateNews *cell = [tableView dequeueReusableCellWithIdentifier:cellName];
        if(cell == nil){
            cell = [[[NSBundle mainBundle] loadNibNamed:@"CellTemplateNewsView" owner:nil options:nil] objectAtIndex:0];
        }

        NSURL *urlRowImage = [NSURL URLWithString:[[NSString alloc]initWithFormat:@"http://webserver.de/inhalte/news/cover/%@", detailDataNews.cover_picture]];
        NSData *dataRowImage = [NSData dataWithContentsOfURL:urlRowImage];
        UIImage *rowImage = [UIImage imageWithData:dataRowImage];
        cell.thumbImage.image = rowImage;

        // [...]

        return cell;
    }
}r
4

3 回答 3

0

不要分配初始化任何对象cellForRowAtIndexPath您可能正在泄漏大量内存。请记住,每次出现单元格时都会调用此方法,即使是以前显示过的单元格也是如此。

此外,您对字符串变量的分配是多余的。这样做就足够了。

BOOL firstCell = (indexPath.row==0 && indexPath.section==0);
NSString *cellIdentifier = firstCell ? @"FirstMainCell" : @"MainCell"; 
UITableViewCell *genericCell = [tableView 
                         dequeueReusableCellWithIdentifier:cellIdentifier];

if (firstCell) {
   cell = (CellTemplateFirstNews*) genericCell;
   // configure...
} 

else {
   cell = (CellTemplateNews*) genericCell;
   // configure...
}

return cell;

延迟的另一个可能原因是对 Web 服务的同步调用。每次单元格变得可见时,您都在执行此操作。您需要延迟加载图像并在必要时更新 UI。

于 2013-01-07T16:22:52.583 回答
0

一种可能性是您忘记CellIdentifier在 Xib 中输入。实际上,reuseIdentifier 方法需要您的单元格具有相同的标识符,但您在创建单元格时从未设置它。Xib 中的那些单元格必须输入其标识符。

于 2013-01-07T16:39:08.790 回答
0

我认为主要问题是每个单元发生的同步网络请求,无论它是否被重用。罪魁祸首是dataWithContentsOfURL:

Check out this apple sample code, or google the phrase "ios lazy table images". In this SO answer, I provide a fairly simple to implement method that takes care of the loading an image asynch, then finding and updating the correct table view row upon completion.

于 2013-01-07T20:51:06.490 回答