UIViewController中的Xcode 5.1 UITableView – 自定义TableViewCell Outlets为零
我有一个UITableView作为UIViewController中的子视图。 我没有使用UITableViewController,因为我有一些其他内容不是与桌面相关的占用屏幕的一部分。 我正在使用故事板。 我把tableview设置为一个出口,viewcontroller是数据源和委托。 如果我在这种情况下使用标准的UITableViewCell,一切正常,我可以加载内容。
我需要为这个tableview使用一个自定义的UITableViewCell,所以我执行了以下步骤:
- 创build一个名为SWTableViewCell的UITableView子类
- 在viewDidLoad中添加了一个调用,使用接口构build器注册单元格:
[self.tableView registerClass:[SWTableViewCell class] forCellReuseIdentifier:@"Cell"];
- 在我的tableview的故事板上,将原型单元格的类设置为SWTableViewCell
- 在故事板中,将单元重用标识符设置为“单元格”
- 在故事板上的原型单元格中添加了一些标签
- 仍然在故事板,从标签ctrl拖动到SWTableViewCell.h创build网点
- 在我的
cellForRowAtIndexPath:
方法中,SWTableViewCell *cell = (SWTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"Cell"];
并将单元格转换为自定义子类:SWTableViewCell *cell = (SWTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"Cell"];
当我检查它的单元格variables是正确的types。 这不是一个UITableViewCell,而是一个SWTableViewCell。 但是没有一个网点是人口稠密的。 属性存在,但它们是零。 我确定有一个我必须失踪的联系,但是我想不出在这一点上我跳过了什么。
这种情况是可能的,还是只是不工作通过IB和故事板?
删除呼叫
[self.tableView registerClass:[SWTableViewCell class] forCellReuseIdentifier:@"Cell"];
解决了这个问题。
我不知道这个方法到底是什么,因为我从来没有用过,所以我会研究它。 如果有人知道这个电话是否需要,请告诉我们!
编辑:
所以, registerClass:forCellReuseIdentifier:
背后的想法是它告诉tableView如何创build新的单元格。 这样,如果dequeueReusableCellWithIdentifier:
不返回一个单元格(如果队列是空的),tableView知道如何创build一个新的单元格,而不需要手动创build一个)。
编辑2:
我发现这个线程,其中说:
如果单元格是使用故事板中的原型创build的,则不需要注册该类。
只需调用dequeueReusableCellWithReuseIdentifier:
将“激活”您的tableView的单元格重用function。
因此, registerClass:forCellReuseIdentifier:
只有在手动构build单元格时才会被调用,而不使用故事板。
这里有一些提示:
基本上可以有3种方式来创build和使用UITableViewCell
:
-
在故事板/笔尖中使用“原型”单元格
(在
UITableView
中的storyboard / nib中创build单元UI)你不应该使用
registerClass:forCellReuseIdentifier:
或者registerNib:forCellReuseIdentifier:
方法。UIStoryboard
自己处理它,因为你在storyboard中指定了reuseIdentifier
,tableView
知道哪个单元与哪个reuseIdentifier
关联。 -
为
tableViewCell
UI使用一个单独的笔尖(当你想在几个
tableView
使用相同的tableViewCell
时,这可能是一种方法)你应该使用
registerNib:forCellReuseIdentifier:
方法。 -
不要使用nib,以编程方式创build
tableViewCell
UI你应该使用
registerClass:forCellReuseIdentifier:
方法。
另外,请注意, registerClass:forCellReuseIdentifier:
和registerNib:forCellReuseIdentifier:
应在之前被调用(通常在viewDidLoad
) dequeueReusableCellWithIdentifier:forIndexPath:
方法被调用。 如果您为reuseIdentifier
注册了一个类或一个nib,则可以确保dequeueReusableCellWithIdentifier:forIndexPath:
返回一个有效的单元格(与dequeueReusableCellWithIdentifier:
不同)。
在你的代码中, Storyboard
为单元注册了一个带UI的nib
,但是你调用了registerClass:forCellReuseIdentifier:
使用相同的reuseIdentifier
强制表视图来注销该笔尖,并注册了不知道IBOutlet
的类。