【问题标题】:Why does a custom TableViewCell not need the File Owner?为什么自定义 TableViewCell 不需要文件所有者?
【发布时间】:2011-12-01 02:49:24
【问题描述】:

我试图在 Interface Builder 中创建一个自定义 UITableViewCell,并将实际 UITableViewCell 的文件所有者和自定义类设置为我的新自定义 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,而不是文件的所有者。这是为什么呢?

谢谢

【问题讨论】:

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


    【解决方案1】:

    文件的所有者是最终将加载 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 循环。你会这样做:

    • 向 MyTableViewController 添加一个“loadedTableViewCell”出口
    • 在表格单元格笔尖中,将文件的所有者设置为 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];
    }
    

    【讨论】:

    • 很好的解释。不知道为什么大家不这样做,而是循环遍历数组,我错过了什么?
    • 有些人更喜欢循环的限制,对于完全词法范围的东西,它不需要实例变量。
    • @JonHess - 很好的解释。感谢您清除它。在相关说明中,TVCell.h 中定义的 IBOutlets 是如何出现在 IB 的 Table View Cell 中的(有点像 IBOutlets 出现在文件所有者中的大多数情况)?一旦将 Table View Cell 定义为 TVCell 类型,它们就会出现。这是表格视图单元格独有的吗?
    • 出口是类的一个属性,IB中的每个对象都有一个类,所以它们都可以有出口。文件的所有者是最常使用它们的地方,但您也可以在其他地方使用它们。例如,在 Mac OS X 上,键盘选项卡循环是通过将“nextKeyView”插座从一个视图连接到另一个视图来设置的。
    【解决方案2】:

    这是因为您将对象从笔尖中拉出,而不是使用整个笔尖,就像您在加载控制器时那样。这就是 for (id currentObject in topLevelObjects) 的作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      相关资源
      最近更新 更多