UITableViewCell原型在同一视图控制器中的两个UITableView之间重用

时间:2013-04-15 01:42:15

标签: objective-c uitableview uistoryboard

从一个表中取消UITableViewCell原型并在另一个表中使用它们是否安全?

当我想在另一个UITableView中显示UITableViewCell时,我只是从表中指定原型类型单元格的dequeueReusableCellWithIdentifier中取出可重用单元格。也就是说,它们不会显示在UITableView中。

它似乎工作正常,我没有注意到日志中的任何错误,但我担心它可能会导致奇怪的问题,因为我以前没有看到它。

我应该为每个细胞使用单独的笔尖来实现这个吗?或者这种做法是好的,不好的做法还是危险的?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (self.prototypesTableView == tableView) {
        cell = [self.prototypesTableView dequeueReusableCellWithIdentifier:cellType];
    }
    else if (self.otherTableView == tableView) {
        cell = [self.otherTableView dequeueReusableCellWithIdentifier:cellType] ?: [self.prototypesTableView dequeueReusableCellWithIdentifier:cellType];
    }
}

2 个答案:

答案 0 :(得分:1)

我非常确定内存中的每个表视图都有自己的表视图单元队列。

当表视图(以及托管它的视图)消失时,释放与其关联的所有对象(假设此处为ARC)。拥有一个带有两个表的视图并不重要:每个表都有自己的单元格集合以便出列。

在我自己的代码中,我经常从一个表到下一个表重用相同的自定义“UITableViewCell”。要注册自定义UITableView单元格(这将是XIB文件中的唯一对象),我这样做:

UINib * nib = [UINib nibWithNibName: @"SomeVeryCustomCell" bundle: nil];
if(nib)
{
    [myTableView registerNib: nib forCellReuseIdentifier:@"SomeVeryCustomCell"];
}

答案 1 :(得分:0)

此代码现在正在生产中运行,我看到没有因为从一个表中出列可重用单元格而在另一个表中使用它们而导致的不良影响。为了确保正确重用,我总是从“otherTableView”出列,如果没有UITableCell可用,则从“prototypesTableView”出列。

虽然为了方便起见我这样实现了它,但我建议以迈克尔建议的方式实现它,因为它提供了更好的在视图控制器之间共享单元格的能力。