我试图在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。这是为什么?
由于
答案 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循环。你这样做是这样的:
然后将您的代码更改为与此类似:
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)所做的。