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

时间:2014-03-12 13:08:38

标签: ios uitableview storyboard

我有一个UITableView作为UIViewController中的子视图。我没有使用UITableViewController,因为我有一些与tableview无关的其他内容占用了部分屏幕。我正在使用故事板。我将tableview设置为插座,viewcontroller是数据源和委托。如果我在这种情况下使用标准的UITableViewCell,一切运行良好,我可以加载内容。

我需要为此tableview使用自定义UITableViewCell,因此我执行了以下步骤:

  1. 创建了一个名为SWTableViewCell
  2. 的UITableView子类
  3. 在viewDidLoad中添加了一个调用,以使用界面构建器注册单元格:[self.tableView registerClass:[SWTableViewCell class] forCellReuseIdentifier:@"Cell"];
  4. 在我的tableview的故事板中,将原型单元的类设置为SWTableViewCell
  5. 在故事板中,将单元格重用标识符设置为" Cell"
  6. 在故事板上为原型单元添加了一些标签
  7. 仍然在故事板中,按住Ctrl键从标签拖动到SWTableViewCell.h以创建出口
  8. 在我的cellForRowAtIndexPath:方法中,将单元格出列并转换为自定义子类:SWTableViewCell *cell = (SWTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"Cell"];
  9. 检查时,单元格变量是正确的类型。它不是UITableViewCell,而是SWTableViewCell。但没有一个网点人口稠密。属性存在,但它们是零。我确定我必须缺少一个连接,但是我无法想到我此时跳过的任何内容。

    这种情况是否可行,还是不能通过IB和故事板工作?

2 个答案:

答案 0 :(得分:8)

删除对

的调用
[self.tableView registerClass:[SWTableViewCell class] forCellReuseIdentifier:@"Cell"];

解决了这个问题。

我不知道这种方法究竟是做什么的,因为我从未使用它,所以我会调查它。如果有人有关于某些信息的信息,请告诉我们!


编辑:

因此,registerClass:forCellReuseIdentifier:背后的想法是告诉tableView如何创建新单元格。这样,如果dequeueReusableCellWithIdentifier:没有返回一个单元格(如果队列为空),则tableView知道如何创建新单元格,并且您不需要手动创建一个单元格。


编辑2:

我找到了this个帖子,其中说:

  

如果使用故事板中的原型创建单元格,则无需注册该类。

只需拨打dequeueReusableCellWithReuseIdentifier:即可激活"单元格重用tableView的功能。

因此,只有在不使用故事板的情况下手动构建单元格时才会调用registerClass:forCellReuseIdentifier:

答案 1 :(得分:4)

以下是一些提示:

基本上可以有3种方法来创建和使用UITableViewCell s:

  1. 在storyboard / nib

    中使用“原型”单元格

    (在UITableView内的storyboard / nib中创建单元格UI)

    不应使用 registerClass:forCellReuseIdentifier:registerNib:forCellReuseIdentifier:方法。 UIStoryboard自己处理它,因为您在故事板中指定了reuseIdentifiertableView知道哪个单元格与哪个reuseIdentifier相关联。

  2. tableViewCell用户界面

    使用单独的笔尖

    (当您想在多个tableViewCell s中使用相同的tableView时,这可能是一种方法

    应使用registerNib:forCellReuseIdentifier: 方法。

  3. 不要使用笔尖,以编程方式创建tableViewCell UI

    应使用registerClass:forCellReuseIdentifier: 方法。

  4. 另请注意,之前应调用registerClass:forCellReuseIdentifier:registerNib:forCellReuseIdentifier:(最常见的是viewDidLoaddequeueReusableCellWithIdentifier:forIndexPath:方法。如果您为reuseIdentifier注册了一个类或一个笔尖,则可以保证dequeueReusableCellWithIdentifier:forIndexPath:返回一个有效的单元格(与dequeueReusableCellWithIdentifier:不同)。

    在您的代码Storyboard中注册了一个nib,其中包含该单元格的UI,但是您使用相同的registerClass:forCellReuseIdentifier:强制表视图调用reuseIdentifier来取消注册该nib并注册不知道IBOutlet s的课程。