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
从提供/关联的UINib
和reuseIdentifier
实例化单元时。 它将加载笔尖的所有顶级对象,并且只使用 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中正确地填充了
UITableViewCell
的reuseIdentifier
(一旦你在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:我想评论一下这个答案,但是由于一些奇怪的原因我不能评论,只能回答。 猜猜我需要一定的评价。