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

Tyl*_*itt 4 iphone cocoa-touch interface-builder uitableview ios

我试图在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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Jon*_*ess 6

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

在这行代码中:

NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TVCell" 
                                                         owner:nil
                                                       options:nil];
Run Code Online (Sandbox Code Playgroud)

您可以在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];
}
Run Code Online (Sandbox Code Playgroud)