2011-10-05 82 views
3

我试图在界面生成器中创建一个自定义的UITableViewCell,并将实际的UITableViewCell的文件所有者和自定义类设置为新的自定义UITableViewCell类。我会挂钩,从文件的所有者的IBOutlets和得到错误,当它来:为什么自定义TableViewCell不需要文件所有者?

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,而不是文件的所有者。为什么是这样?

感谢

回答

4

文件所有者是最终将加载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]; 
} 
+0

优秀的解释。我不知道为什么每个人都不这样做,而不是循环访问数组,我错过了什么? – jrturton

+0

有些人更喜欢循环的限制,它不需要一个实例变量来完成词汇范围。 –

+0

@JonHess - 很好的解释。谢谢你清理那个。在相关说明中,“TVCell.h”中定义的IBOutlets如何出现在IB的Table View Cell中(有点像IBOutlets在文件所有者中出现的次数)?它们在表格视图单元被定义为TVCell类型时出现。这对于表格视图单元格是独特的吗? –

0

这是因为你拉出来的对象笔尖,不使用整个笔尖,喜欢你,如果你加载控制器。这就是for(topLevelObjects中的id currentObject)所做的事情。

相关问题