我注意到我的cellViews没有清除。这意味着,当我向上和向下滚动时,子视图不断添加刚刚重用的cellView ...我做错了什么?
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString* cellIdentifier=@"cell";
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if(cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
}
UIImageView cellView = [[UIImageView alloc] initWithFrame:rectCellFrame];
NSError* error=nil;
NSData* imageData = [NSData dataWithContentsOfURL:imageArray[indexPath.row] options:NSDataReadingUncached error:&error];
UIImage* theImage= [UIImage ImageWithData:imageData];
[cellView setImage:theImage];
[cell addSubView:cellView];
.
.
.
.
[cell addSubView:moreViews];
}
答案 0 :(得分:1)
如果您要显着修改单元格的内容,我建议创建UITableViewCell
的子类并引用它而不是基类。这样,您可以在子类的drawRect
方法中进行更新,而不是修改CFRAIP中的UITableViewCell
。
请注意,您还可以调用单元格的prepareForReuse
方法,以便在重复使用单元格之前重置属性。
答案 1 :(得分:1)
当dequeueReusableCellWithIdentifier:
返回一个单元格(而不是nil)时,它是您之前在tableView:cellForRowAtIndexPath:
方法中创建的单元格。您在第一次创建时添加到该单元格的每个子视图仍在其中。如果您从dequeueReusableCellWithIdentifier:
获取单元格时添加更多子视图,则单元格中会有额外的子视图。
您的tableView:cellForRowAtIndexPath:
方法应具有以下基本结构:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *const kIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:kIdentifier];
// code here to add subviews to cell.contentView
}
// code here to configure those subviews to display the content for indexPath, e.g.
// set the image of image views and the text of labels.
return cell;
}
棘手的部分是访问子视图以在dequeueReusableCellWithIdentifier:
返回单元格时设置其内容。请查看“Programmatically Adding Subviews to a Cell’s Content View” in the Table View Programming Guide for iOS,其中介绍了如何使用视图标记访问子视图。
答案 2 :(得分:1)
您正在每次方法调用时向单元格添加子视图。这意味着,当一个单元格被重用时,它已经有了旧的子视图。您应该在添加新的之前删除它们。
例如。 [cell.contentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
答案 3 :(得分:0)
每次调用- (UITableViewCell*)cellForRowAtIndexPath:(NSIndexPath *)indexPath
时,cellView
和moreViews
都会再次添加到您已添加这些UIView
的单元格中。
当您致电dequeueReusableCellWithIdentifier
时,可重复使用的单元格不会删除其子视图。
如果要添加子视图,最佳解决方案是子类UITableViewCell
并在子类init
UITableViewCell
方法中添加子视图