繁体   English   中英

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

[英]Xcode 5.1 UITableView in UIViewController - Custom TableViewCell Outlets are nil

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

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

  1. 创建了一个名为SWTableViewCell的UITableView子类
  2. 在viewDidLoad中添加了一个调用,用接口生成器注册单元格: [self.tableView registerClass:[SWTableViewCell class] forCellReuseIdentifier:@"Cell"];
  3. 在我的tableview上的故事板中,将原型单元的Class设置为SWTableViewCell
  4. 在故事板中,将单元重用标识符设置为“Cell”
  5. 在故事板上为原型单元添加了一些标签
  6. 仍然在故事板中,按住Ctrl键从标签拖动到SWTableViewCell.h以创建出口
  7. 在我的cellForRowAtIndexPath:方法中,将单元格出列并转换为自定义子类: SWTableViewCell *cell = (SWTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"Cell"];

检查时,单元格变量是正确的类型。 它不是UITableViewCell,而是SWTableViewCell。 但没有一个网点人口稠密。 属性存在,但它们是零。 我敢肯定有一个我必须要忘记的联系,但我想不出我在这一点上跳过的任何事情。

这种情况是否可行,或者它是否只能通过IB和故事板工作?

删除呼叫

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

解决了这个问题。

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


编辑:

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


编辑2:

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

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

只需调用dequeueReusableCellWithReuseIdentifier:将“激活”tableView的单元重用功能。

所以registerClass:forCellReuseIdentifier:只有在不使用故事板的情况下手动构建单元格时才会被调用。

以下是一些提示:

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

  1. 在storyboard / nib中使用“prototype”单元格

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

    不应该使用 registerClass:forCellReuseIdentifier:registerNib:forCellReuseIdentifier: methods。 UIStoryboard自己处理它,因为你在storyboard中指定了reuseIdentifiertableView知道哪个cell与哪个reuseIdentifier相关联。

  2. tableViewCell UI使用单独的nib

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

    应该使用registerNib:forCellReuseIdentifier:方法。

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

    应该使用registerClass:forCellReuseIdentifier:方法。

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

在您的代码中, Storyboard为单元格注册了一个带有UI的nib ,但是您调用了registerClass:forCellReuseIdentifier:使用相同的reuseIdentifier强制表视图取消注册nib并注册不知道IBOutlet的类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM