UITableView registerNib:forCellReuseIdentifier:

我看到这个在WWDCvideo中使用,但只是非常简短。 他们没有去如何创build实际的xib文件。

我有一个名为MyCustomCell的UITableViewCell子类。 在这个我有几个属性UILabels,UIImageViews等…所有设置为IBOutlets。

现在,在我的xib文件中…

我作为文件的所有者设置了什么? 我在哪里引用我的MyCustomCell类是这个文件的所有者?

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

我已经尝试了一些设置,但是在使用它的时候我总是收到错误。

哦,我用来注册的代码是…

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

谢谢

通常情况下,在这种情况下,您不必担心文件的所有者,因为当tableView从提供/关联的UINibreuseIdentifier实例化单元时。 它将加载笔尖的所有顶级对象,并且只使用 UITableViewCell的第一个顶级对象 (或者只是第一个顶级对象而不pipe类是什么? UITableViewCell在你的XIB无论如何 – 不计算File's Owner和第First Responder只是“代理”)。

实际上, tableView会尝试将一个单元出队,如果它没有find可重用的单元,它将使用您提供的UINib创build一个新UINib 。 这将是类似的东西:

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

(这当然是一个简化版本,只是为了展示这个想法,我不知道它是否实际上调用了这些确切的线条,但它应该非常接近)

所以在这种情况下File's Owner不被使用 ,你只需要把一个简单的自定义的UITableViewCell作为你的XIB文件的唯一顶层对象放在现有File's Owner First Responder旁边“代理”/“外部对象引用”,不会被实例化,也不会成为instantiateWithOwner:options: :)返回的顶级对象的一部分。


如果它仍然不起作用:

  • 确保你在IB中正确地填充了UITableViewCellreuseIdentifier (一旦你在IB中select了你的单元格,在右边的Object Inspector窗格中),并在IB中使用与这个reuseIdentifier属性完全相同的值,即在代码中使用的值
  • 如果仍然没有运气,请提供更多信息,尤其是哪种错误,日志消息或exception。

我发现问题中给出的代码是好的,但是如果你使用的是故事板,你不能在init方法中引用self.tableView 。 在另一个问题上有一些讨论 。

所以第一行是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''"

而且,是的,我正在做一些非常类似于从Storyboards中舀出东西的东西,并将它们放在xibs中以便在视图控制器中重用!

除了来自“AliSoftware”的答案请注意,这里最不明显的是UITableViewCell必须是根视图 * ABOVE *甚至UIView。 默认情况下,当我select一个新的IB文件时,它创build一个UIView。 所以删除UIView有帮助。 谢谢。

PS:我想评论一下这个答案,但是由于一些奇怪的原因我不能评论,只能回答。 猜猜我需要一定的评价。