首页 文章

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

提问于
浏览
3

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

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

  • 创建了一个名为SWTableViewCell的UITableView子类

  • 在viewDidLoad中添加了一个调用,用于向接口构建器注册单元格: [self.tableView registerClass:[SWTableViewCell class] forCellReuseIdentifier:@"Cell"];

  • 在我的tableview的故事板中,将原型单元的Class设置为SWTableViewCell

  • 在故事板中,将单元格重用标识符设置为"Cell"

  • 在故事板上为原型单元添加了一些标签

  • 仍在故事板中,按住Ctrl键从标签拖动到SWTableViewCell.h以创建出口

  • 在我的 cellForRowAtIndexPath: 方法中,将单元格出列并转换为自定义子类: SWTableViewCell *cell = (SWTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"Cell"];

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

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

2 回答

  • 8

    删除呼叫

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

    解决了这个问题 .

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


    编辑:

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


    编辑2:

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

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

    只需调用 dequeueReusableCellWithReuseIdentifier: 将"activate"重新使用tableView的单元格功能 .

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

  • 4

    以下是一些提示:

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

    • 在storyboard / nib中使用 “prototype” cells

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

    should not use either registerClass:forCellReuseIdentifier:registerNib:forCellReuseIdentifier: 方法 . UIStoryboard 自己处理它,因为你在故事板中指定了 reuseIdentifiertableView 知道哪个单元格与 reuseIdentifier 相关联 .

    • 使用 a separate nib for tableViewCell UI

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

    should use registerNib:forCellReuseIdentifier: 方法 .

    • 不要使用nibs,创建 tableViewCell UI programmatically

    should use registerClass:forCellReuseIdentifier: 方法 .

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

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

相关问题