为什么自定义TableViewCell不需要文件所有者?

时间:2011-10-05 00:36:57

标签: iphone ios cocoa-touch uitableview interface-builder

我试图在Interface Builder中创建一个自定义UITableViewCell,并将实际UITableViewCell的File的Owner和Custom Class设置为我的新自定义UITableViewCell类。我会从文件所有者那里挂起IBOutlets并在出现错误时获取错误:

 TVCell *cell = (TVCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {

    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TVCell" owner:nil options:nil];

    for(id currentObject in topLevelObjects)
    {
        if([currentObject isKindOfClass:[TVCell class]])
        {
            cell = (TVCell *)currentObject;
            break;
        }
    }

最后我意识到你必须从UITableViewCell对象而不是文件所有者那里连接IBOutlets。这是为什么?

由于

2 个答案:

答案 0 :(得分:6)

文件所有者是最终将加载NIB的对象的占位符对象。这是NIB之外的对象引用NIB内部对象的一种方式。在您的情况下,您正在尝试从NIB创建表视图单元格,因此您需要一些其他对象作为所有者。表格视图单元格不能同时位于NIB的外部和内部。

在你的代码的这一行:

NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TVCell" 
                                                         owner:nil
                                                       options:nil];

您可以在Interface Builder中为文件所有者占位符指定要解析的对象。我猜你的代码在像'MyTableViewController'这样的类中。如果是,您可以将owner参数的'self'传递给 - [NSBundle loadNibNamed:owner:]。如果你这样做了,你可以在MyTableViewController类上安装有用于加载这个NIB的插座。具体来说,您可以使用它们来避免您拥有的for循环。你这样做是这样的:

  • 将“loadedTableViewCell”插座添加到MyTableViewController
  • 在表格单元格中,将文件的所有者设置为MyTableViewController。
  • 将'loadedTableViewCell'从文件所有者连接到表格视图单元格。

然后将您的代码更改为与此类似:

TVCell *cell = (TVCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"TVCell" owner:self options:nil];
    cell = [self loadedTableViewCell];
    [self setLoadedTableViewCell:nil];
}

答案 1 :(得分:0)

这是因为你正在将对象拉出笔尖,而不是使用整个笔尖,就像你加载控制器一样。这就是for(topLevelObjects中的id currentObject)所做的。