我有一个自定义表格视图单元格类。我动态地创建 uiviews 和 uilabels 和 uiimageview 到单元格和分配并使用 frame.contentView 初始化它们。但是在滚动时,由于重用,它们会重叠,标签的文本和其他属性也会重叠。
4 回答
最后通过为每个子视图使用标签解决了这个问题。从它的父视图按标签获取视图后,如果视图不存在,那么我重新分配并添加SubView。这解决了这个问题。
如果您重用单元格,您几乎完全负责在重用之前重置其内容。在我看来,这个问题在 SDK 文档中仍未得到充分解释。
这意味着,在调用 [dequeueReusableCellWithIdentifier] 之后,您应该执行以下操作:
1) 设置/重置 textLabel 和 detailTextLabel 上的颜色、字体和文本,如果你曾经触摸过这些。
2) 调整附件类型。
3) 调整框架和背景颜色。
4)删除所有非标准子视图。我通常这样编码:
for (UIView *subView in cell.contentView.subviews) {
if (subView == cell.textLabel) continue;
if (subView == cell.imageView) continue;
if (subView == cell.detailTextLabel) continue;
[subView removeFromSuperview];
}
等等。任何可以触及特定重用标识符的东西都应该重置为零状态。
检查表格的行大小和自定义单元格的行大小应该相同以获得正确的视图。
重复使用 tabeview 单元格后,像这样检查和分配单元格。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"SampleCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
NSLog(@"cai no init da cell");
// change style according to yours..
}
return cell
}
听起来您正在向tableview:cellForRowAtIndexPath:
方法内的单元格添加子视图。当单元被重用时,以前使用的视图已经存在于单元中,您将忽略这些新视图而只是添加更多视图。
正确的方法是在初始化单元格时添加视图,然后在tableview:cellForRowAtIndexPath:
方法中设置视图的值。
您应该使用从 UITableViewCell 继承的自定义类并为要添加的视图创建属性(以便可以在 中访问它们tableview:cellForRowAtIndexPath:
)。然后,您可以init
在自定义类的调用中添加视图,或者使用 XIB 或原型单元添加视图并将它们作为 IBOutlets 连接到属性。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyModelObject* myObject = myObjects[indexPath.row];
if (myObject.images.count == 1) {
MyCustomTableViewCellOne *cell = (MyCustomTableViewCellOne*) [self.tableView dequeueReusableCellWithIdentifier:@"MyCustomTableViewCellOneIdentifer" forIndexPath:indexPath];
cell.title = @"Some item";
cell.imageView.image = [UIImage imageNamed:@"image.png"];
return cell;
} else {
MyCustomTableViewCellTwo *cell = (MyCustomTableViewCellTwo) [self.tableView dequeueReusableCellWithIdentifier:@"MyCustomTableViewCellTwoIdentifer" forIndexPath:indexPath];
cell.title = @"Some item";
cell.imageView.image = [UIImage imageNamed:@"image.png"];
cell.imageView2.image = [UIImage imageNamed:@"image2.png"];
return cell;
}
}
MyCustomTableViewCellOne.h:
@interface MyCustomTableViewCellOne : UITableViewCell
@property (strong, nonatomic) IBOutlet UILabel *title;
@property (strong, nonatomic) IBOutlet UIImageView *imageView;
@end
MyCustomTableViewCellTwo.h:
@interface MyCustomTableViewCellTwo : UITableViewCell
@property (strong, nonatomic) IBOutlet UILabel *title;
@property (strong, nonatomic) IBOutlet UIImageView *imageView;
@property (strong, nonatomic) IBOutlet UIImageView *imageView2;
@end