7

目前我有一个带有自定义 UITableViewCells 的新闻源,例如:

NewsCell.m
NewsCell.xib


NewsCell_Friends.m
NewsCell_Friends.xib
NewsCell_CheckinPhoto.m
NewsCell_CheckinPhoto.xib

[...]

NewsCell_Friends 和 NewsCell_Checkin 都继承自 NewsCell(所有子类共享的方法和元素,如 titleLabel、dateLabel)

目前,我从未使用过 NewsCell 类本身,只使用子类,因为每种新闻都有非常独特的布局(Xib)。

现在让我们说,我想在我的新闻源的 UI 方面有一个轻量级的实现,其中所有单元格具有相同的外观、相同的高度、相同的内容:titleLabel 和 dateLabel。(例如实际上的通知提要)。

我想做的是重用 NewsCell.xib 作为每种新闻的独立版本,例如:

NewsCell_CheckinPhoto *cell = [tableView dequeueReusableCellWithIdentifier:@"CheckinPhoto"];
    if (!cell){
        UIViewController *c = [[UIViewController alloc] initWithNibName:@"NewsCell" bundle:nil];
        cell = (NewsCell_CheckinPhoto *)c.view;
        cell.parent = self;
    }
    [cell configureCell:indexPath withNews:news];
    return  cell;

cellForRowAtIndexPath委托方法中。

请注意,我在此控制器中使用的是 NewsCell xib 而不是 NewsCell_CheckinPhoto xib。

但它不起作用:nib 文件加载良好,并且 NewsCell.xib 的内容很好地显示在单元格中,但是 NewsCell_CheckinPhoto 中的标签配置(例如,titleLabel.text = @"Robert 拍了一张照片")类既不工作,也不叫。

仅当我在 NewsCell.xib 文件中指定类类型 *NewsCell_CheckinPhoto* 时它才有效,但这不允许我重用 NewsCell.xib 来呈现带有示例和唯一表示的 NewsCell 的每个子类。

4

1 回答 1

0

当我理解你正确时,你想从 XIB 加载一个单元格。
你不应该这样做

UIViewController *c = [[UIViewController alloc] initWithNibName:@"NewsCell" bundle:nil]; 但只将单元格放在 XIB 中,然后将其加载

UITableViewCell *cell = [[NSBundle mainBundle] loadNibNamed:@"NewsCell"][0];

或类似的(请查看文档)。

还请记住,当您从 XIB 加载诸如表格视图单元格之类的内容时,它会使用initWithCoder:、 notinit或进行初始化initWithFrame:。这可能是您的网点未初始化的原因。

于 2013-08-23T15:06:02.613 回答