UIViewController中的Xcode 5.1 UITableView – 自定义TableViewCell Outlets为零

我有一个UITableView作为UIViewController中的子视图。 我没有使用UITableViewController,因为我有一些其他内容不是与桌面相关的占用屏幕的一部分。 我正在使用故事板。 我把tableview设置为一个出口,viewcontroller是数据源和委托。 如果我在这种情况下使用标准的UITableViewCell,一切正常,我可以加载内容。

我需要为这个tableview使用一个自定义的UITableViewCell,所以我执行了以下步骤:

  1. 创build一个名为SWTableViewCell的UITableView子类
  2. 在viewDidLoad中添加了一个调用,使用接口构build器注册单元格: [self.tableView registerClass:[SWTableViewCell class] forCellReuseIdentifier:@"Cell"];
  3. 在我的tableview的故事板上,将原型单元格的类设置为SWTableViewCell
  4. 在故事板中,将单元重用标识符设置为“单元格”
  5. 在故事板上的原型单元格中添加了一些标签
  6. 仍然在故事板,从标签ctrl拖动到SWTableViewCell.h创build网点
  7. 在我的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

  1. 在故事板/笔尖中使用“原型”单元格

    (在UITableView中的storyboard / nib中创build单元UI)

    不应该使用 registerClass:forCellReuseIdentifier:或者registerNib:forCellReuseIdentifier:方法。 UIStoryboard自己处理它,因为你在storyboard中指定了reuseIdentifiertableView知道哪个单元与哪个reuseIdentifier关联。

  2. tableViewCell UI使用一个单独的笔尖

    (当你想在几个tableView使用相同的tableViewCell时,这可能是一种方法)

    应该使用registerNib:forCellReuseIdentifier:方法。

  3. 不要使用nib,以编程方式创buildtableViewCell UI

    应该使用registerClass:forCellReuseIdentifier:方法。

另外,请注意, registerClass:forCellReuseIdentifier:registerNib:forCellReuseIdentifier:应在之前被调用(通常在viewDidLoaddequeueReusableCellWithIdentifier:forIndexPath:方法被调用。 如果您为reuseIdentifier注册了一个类或一个nib,则可以确保dequeueReusableCellWithIdentifier:forIndexPath:返回一个有效的单元格(与dequeueReusableCellWithIdentifier:不同)。

在你的代码中, Storyboard为单元注册了一个带UI的nib ,但是你调用了registerClass:forCellReuseIdentifier:使用相同的reuseIdentifier强制表视图来注销该笔尖,并注册了不知道IBOutlet的类。