tableview出列可重复使用的细胞重叠

时间:2015-04-09 00:47:30

标签: ios uitableview reuseidentifier

我有一个自定义表格视图单元格类。我动态创建uiviews和uilabels和uiimageview到cell并使用frame.contentView分配和初始化它们。但由于重复使用滚动,它们会重叠,标签的文本和其他属性会重叠。

4 个答案:

答案 0 :(得分:0)

如果您重复使用单元格,则几乎完全有责任在重用之前重置其内容。在我看来,这是一个在SDK文档中仍未充分解释的问题。

这意味着,在调用[dequeueReusableCellWithIdentifier]之后,您应该执行以下操作:

1)如果您触摸过这些,请在textLabel和detailTextLabel上设置/重置颜色,字体和文本。

2)调整accessoryType。

3)调整frame和backgroundColors。

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

等等。任何可以触及特定重用标识符的东西都应该重置为零状态。

答案 1 :(得分:0)

检查表的行大小和自定义单元格的行大小应该相同以获得正确的视图。

重用tableviewcell后检查并分配这样的单元格。

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

}

答案 2 :(得分:0)

听起来您正在向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

答案 3 :(得分:0)

最后通过为每个子视图使用标记解决了这个问题。从它的父视图中通过标记获取视图后,如果视图不存在,则我重新分配并添加子视图。这解决了这个问题。