42

我在 WWDC 视频中看到了这一点,但只是非常简短。他们没有讨论如何创建实际的 xib 文件。

我有一个名为 MyCustomCell 的 UITableViewCell 子类。在这我有几个属性 UILabels、UIImageViews 等......都设置为 IBOutlets。

现在,在我的 xib 文件中......

我将什么设置为文件的所有者?我在哪里引用我的 MyCustomCell 类是文件的所有者吗?

一旦我设置了文件的所有者,如何将它与 xib 的根视图链接?

我已经尝试了一些设置,但在使用它时总是出错。

哦,我用来注册它的代码是......

self.cellNib = [UINib nibWithNibName:@"MyCustomCell" bundle:nil];
[self.tableView registerNib:self.cellNib forCellReuseIdentifier:@"CustomCell"];

谢谢

4

3 回答 3

48

通常,在这种情况下,您不必担心文件的所有者,因为当tableView从提供的/关联的单元格UINibreuseIdentifier. 它将加载笔尖的所有顶级对象,并且仅使用属于类的第一个顶级对象UITableViewCell或者可能只是第一个顶级对象而不管类?但通常你只有你的UITableViewCellin无论如何,您的 XIB - 不计算 theFile's Owner和 the First Responder,它们只是“代理”)。

事实上,它将尝试使一个单元格出列,如果它没有找到一个可重用的单元格,它将使用您提供tableView的创建一个新单元格。UINib这将类似于以下内容:

NSArray* topLevelObjects = [self.cellNib instantiateWithOwner:nil options:0];
cell = [topLevelObjects objectAtIndex:0];

(这当然是一个简化的版本只是为了展示这个想法,我不知道它是否真的调用了这些确切的行,但它应该很接近)

因此,在这种特殊情况下File's Owner不使用,您只需将一个简单的自定义UITableViewCell作为您的 XIB 文件的唯一顶级对象File's Owner放在现有的anf旁边First Responder(同样,只是“代理”/“外部对象引用”并且不会被实例化,也不会成为instantiateWithOwner:options:) 返回的顶级对象的一部分。


如果它仍然不起作用:

  • 确保您正确填写了reuseIdentifierIBUITableViewCell的 (在您选择 IB 中的单元格后,在右侧的 Object Inspector 窗格中),并在 IB 中使用与您在代码中使用的属性完全相同的值reuseIdentifier
  • 如果还是不行,请提供更多信息,特别是你有什么样的错误、日志消息或异常。
于 2012-09-25T20:40:00.513 回答
11

我发现问题中给出的代码很好,但是如果您使用情节提要,则无法self.tableView在方法中引用。在另一个问题中init有一些讨论。

所以第一行进入init

self.cellNib = [UINib nibWithNibName:@"MyCustomCell" bundle:nil];

但是这条线应该进入viewDidLoad或类似:

[self.tableView registerNib:self.cellNib forCellReuseIdentifier:@"CustomCell"];

这解决了我的神秘错误,例如"*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle <Foo.app> (loaded)' with name 'Ogf-Sj-1ej-view-bBf-Ti-Dda''"

而且,是的,我正在做一些非常相似的事情,从 Storyboard 中舀出东西并将它们放在 xib 中以便在视图控制器之间重用!

于 2013-11-15T02:50:57.737 回答
3

除了来自“AliSoftware”的回答之外,请注意这里最不明显的事情是 UITableViewCell 必须是Root View * ABOVE * 甚至是 UIView。默认情况下,当我选择一个新的 IB 文件时,它会创建一个 UIView。所以删除 UIView 会有所帮助。谢谢。

PS:我想对该答案发表评论,但由于某种奇怪的原因我无法发表评论,只能回答。我想我需要一个特定的评级。

于 2014-03-17T05:43:56.413 回答