重复使用UITableViewCell,无需重复数据

时间:2015-05-13 07:36:55

标签: ios objective-c xcode uitableview

我在重复使用多个自定义UITableViewCell时出现问题。我有3种类型的自定义UITableViewCell。我尝试使用UITableViewCell重复使用dequeueReusableCellWithIdentifier

我写了prepareForReuse并将所有可能的子视图数据设为零。但是我仍然在某些UITableViewCell中重复了一些数据。所以我想在没有任何数据的情况下重复使用xib。

我编写了以下代码。该应用程序现在似乎有一些冻结问题。有人请告诉我在没有数据重复的情况下重用tableview UITableViewCells的正确方法。

 static NSString *cellIdentifier = @"SystemListCell";

 IXSystemMessageCustomCell *cell = (IXSystemMessageCustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

 if (cell == nil) {
      cell = [[[NSBundle mainBundle] loadNibNamed:@"IXSystemMessageCustomCell" owner:self options:nil] objectAtIndex:0];
      cell.selectionStyle = UITableViewCellSelectionStyleNone;
 }
 IXSystemMessageCustomCell *cellToSave = cell;
 [self configureSystemCell: cellToSave atIndexPath:indexPath];
 return cellToSave;

3 个答案:

答案 0 :(得分:0)

请勿修改prepareForReuse

中的数据

更好的方法是

dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath

我们应该始终修改cellForRowAtIndexPath中的数据,因为这有助于重复使用单元格。

此外,由于您已经创建了IXSystemMessageCustomCell类,因此最好使用它:

[[IXSystemMessageCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]

并在initWithStyle:reuseIdentifier:

中编写设置代码

而不是:

cell = [[[NSBundle mainBundle] loadNibNamed:@"IXSystemMessageCustomCell" owner:self options:nil] objectAtIndex:0];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

干杯!

答案 1 :(得分:0)

您可以为3种细胞类型使用3种不同的重用标识符:

IXSystemMessageCustomCell *cell;
if (some condintion) {
    cell = (IXSystemMessageCustomCell *)[tableView dequeueReusableCellWithIdentifier:"CellReuseIdentifierType1"];
} else if (some condition 2) {
    cell = (IXSystemMessageCustomCell *)[tableView dequeueReusableCellWithIdentifier:"CellReuseIdentifierType2"];
} else {
    cell = (IXSystemMessageCustomCell *)[tableView dequeueReusableCellWithIdentifier:"CellReuseIdentifierType3"];
}

在这种情况下,您不需要每次为每种细胞类型重新配置细胞

答案 2 :(得分:0)

试试这个......

IXSystemMessageCustomCell *cell = nil;
cell = (IXSystemMessageCustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

通过首先将单元格设置为nil,您将清除与重用单元格关联的先前数据。

还要在viewDidLoad或类似的表格视图生命周期方法中注册您的笔尖一次,这样在每次调用tableView:cellForRowAtIndexPath时都不需要这样做。

因此,从任何方法中提取静态调用都是私有声明......

static NSString *cellIdentifier = @"SystemListCell";

并调整您的方法以阅读...

- (void)viewDidLoad {
    UINib *nib = [UINib nibWithNibName:@"IXSystemMessageCustomCell" bundle:nil];
    [<<self.tableView>> registerNib:nib
             forCellReuseIdentifier:cellIdentifier];

    << ... other code ... >>

}

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

    IXSystemMessageCustomCell *cell = nil;

    cell = (IXSystemMessageCustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    [self configureSystemCell:cell atIndexPath:indexPath];

    return cell;
}