我将尝试使用2种不同类型的单元格来实现TableView,第一种是内部带有全宽图像的高级单元格,所有其他单元格左侧都有一个小拇指图像。
我的问题是TableView的性能。如果我滚动一个可能包含20个项目的列表,它会稍微晃动一下。我的表现很红,我希望代码不是那么糟糕:
以下是重要的部分:
- (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
答案 0 :(得分:0)
不要在cellForRowAtIndexPath
中分配init初始化任何对象你可能正在泄漏大量内存。请记住,每次进入视图时都会调用此方法,甚至是之前显示过的单元格。
此外,您对字符串变量的赋值是多余的。就这样做就足够了。
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。
答案 1 :(得分:0)
一个可能性是您忘记在Xib中输入CellIdentifier
。实际上,reuseIdentifier方法需要您的单元格具有相同的标识符,但是在创建单元格时从不设置它。 Xib中的那些单元格必须输入其标识符。
答案 2 :(得分:0)
我认为主要问题是每个小区发生的同步网络请求,无论是否重复使用。罪魁祸首是dataWithContentsOfURL:
。
查看此apple sample code,或google短语" ios lazy table images"。 In this SO answer,我提供了一个相当简单的实现方法,负责处理图像异步,然后在完成时查找并更新正确的表视图行。