我有一个UITableView作为UIViewController中的子视图。我没有使用UITableViewController,因为我有一些与tableview无关的其他内容占用了部分屏幕。我正在使用故事板。我将tableview设置为插座,viewcontroller是数据源和委托。如果我在这种情况下使用标准的UITableViewCell,一切运行良好,我可以加载内容。
我需要为此tableview使用自定义UITableViewCell,因此我执行了以下步骤:
[self.tableView registerClass:[SWTableViewCell class] forCellReuseIdentifier:@"Cell"];
cellForRowAtIndexPath:
方法中,将单元格出列并转换为自定义子类:SWTableViewCell *cell = (SWTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"Cell"];
检查时,单元格变量是正确的类型。它不是UITableViewCell,而是SWTableViewCell。但没有一个网点人口稠密。属性存在,但它们是零。我确定我必须缺少一个连接,但是我无法想到我此时跳过的任何内容。
这种情况是否可行,还是不能通过IB和故事板工作?
答案 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:
在storyboard / nib
中使用“原型”单元格(在UITableView
内的storyboard / nib中创建单元格UI)
您不应使用 registerClass:forCellReuseIdentifier:
或registerNib:forCellReuseIdentifier:
方法。 UIStoryboard
自己处理它,因为您在故事板中指定了reuseIdentifier
,tableView
知道哪个单元格与哪个reuseIdentifier
相关联。
对tableViewCell
用户界面
(当您想在多个tableViewCell
s中使用相同的tableView
时,这可能是一种方法
您应使用registerNib:forCellReuseIdentifier:
方法。
不要使用笔尖,以编程方式创建tableViewCell
UI
您应使用registerClass:forCellReuseIdentifier:
方法。
另请注意,之前应调用registerClass:forCellReuseIdentifier:
和registerNib:forCellReuseIdentifier:
(最常见的是viewDidLoad
)dequeueReusableCellWithIdentifier:forIndexPath:
方法。如果您为reuseIdentifier
注册了一个类或一个笔尖,则可以保证dequeueReusableCellWithIdentifier:forIndexPath:
返回一个有效的单元格(与dequeueReusableCellWithIdentifier:
不同)。
在您的代码Storyboard
中注册了一个nib
,其中包含该单元格的UI,但是您使用相同的registerClass:forCellReuseIdentifier:
强制表视图调用reuseIdentifier
来取消注册该nib并注册不知道IBOutlet
s的课程。