我有一个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 回答
删除呼叫
解决了这个问题 .
我不知道这个方法究竟是做什么的,因为我从未使用它,所以我会调查一下 . 如果有人有关于某些信息的信息,请告诉我们!
编辑:
所以,
registerClass:forCellReuseIdentifier:
背后的想法是告诉tableView如何创建新单元格 . 这样,如果dequeueReusableCellWithIdentifier:
没有返回一个单元格(如果队列为空),则tableView知道如何创建一个新单元格,而您不需要手动创建一个单元格 .编辑2:
我找到了this帖子,其中说:
只需调用
dequeueReusableCellWithReuseIdentifier:
将"activate"重新使用tableView的单元格功能 .因此,只有在不使用故事板的情况下手动构建单元格时才会调用
registerClass:forCellReuseIdentifier:
.以下是一些提示:
基本上可以有3种方法来创建和使用
UITableViewCell
:(在
UITableView
里面的storyboard / nib中创建单元格UI)你 should not use either
registerClass:forCellReuseIdentifier:
或registerNib:forCellReuseIdentifier:
方法 .UIStoryboard
自己处理它,因为你在故事板中指定了reuseIdentifier
,tableView
知道哪个单元格与reuseIdentifier
相关联 .tableViewCell
UI(当你想在几个_1139494中使用相同的
tableViewCell
时,这可能是一种方法)你 should use registerNib:forCellReuseIdentifier: 方法 .
tableViewCell
UI programmatically你 should use registerClass:forCellReuseIdentifier: 方法 .
另请注意,之前应调用
registerClass:forCellReuseIdentifier:
和registerNib:forCellReuseIdentifier:
(最常见的是viewDidLoad
)dequeueReusableCellWithIdentifier:forIndexPath:
方法 . 如果您为reuseIdentifier
注册了一个类或一个nib,则保证dequeueReusableCellWithIdentifier:forIndexPath:
返回一个有效的单元格(与dequeueReusableCellWithIdentifier:
不同) .在您的代码
Storyboard
中注册了nib
,其中包含用于单元格的UI,但是您使用相同的reuseIdentifier
强制表视图调用registerClass:forCellReuseIdentifier:
来取消注册该nib并注册不知道IBOutlet
的类 .