我无法理解这是如何工作的。我已经阅读了很多关于它的主题——比如UITableView dequeueReusableCellWithIdentifier Theory和How does dequeueReusableCellWithIdentifier: work? .
但是,我的 UITableView 每次都会成功地将一个单元格出列(它永远不会为零),即使它第一次加载也是如此。我的印象是类似的单元格应该使用相同的标识符,因此您只需更改必要的内容。
因为
if (!cell) {
NSLog(@"New cell");
cell = [[UITableViewCell alloc] initWithStyle:someStyle reuseIdentifier:someIdentifier];
}
永远不会被调用,我不确定我应该如何处理同一个表中具有不同样式的单元格,因为样式只能在初始化程序中设置。
我还尝试使用不同的单元格标识符,以确保它没有重复使用来自不同表或其他内容的单元格。我正在注册这些标识符[tableView registerClass: forCellReuseIdentifier:]
如果我理解的话,这个方法应该只返回以前创建的已经移出屏幕的单元格(隐藏,即可以重复使用)。那么它为什么在第一次被调用时返回一个单元格呢?
编辑:所以混淆是使用[tableView dequeueReusableCellWithIdentifier: forIndexPath:]
而不是[tableView dequeueReusableCellWithIdentifier:]
(第一个需要注册标识符,如果没有可用的第二个将返回 nil - 我在上面期望的行为)。
但是,我注意到当我将代码更改为 use[tableView dequeueReusableCellWithIdentifier:]
时,它会创建一个新单元格,其contentView.frame
宽度为 320(全宽)。以前,当我这样做时,dequeue...forIndexPath
它会给出 302 的宽度,或单元格的视觉/“真实”宽度。为什么是这样?
另外,有没有办法指定 UITableViewCells regstiered 的样式以供重用?
解决方案:所以我发现这个线程UITableView cell.contentView.bounds.size.width Changes With Cell Reuse,它说当你将 autoresizingmask 设置为 UIViewAutoresizingFlexibleLeftMargin 时,当你尝试进行相对定位时它是固定的(contentView 宽度最初是完全宽度,但是当你展示它时它会缩小,所以如果你正确地计算它仍然会正确显示)。
我将 UISwitch 放置在右侧 - 当我设置自动调整大小蒙版时,它在第一次显示时起作用,但在我切换它时又移动了约 20 个像素。我不知道是什么导致了这种额外的转变,但我最终通过简单地将 UISwitch 设置为单元格的附件视图来解决它。
(这部分偏离了原始问题的主题,但如果有人偶然发现这可能会很有用)。对于任何特别想知道原始问题的人,答案在第一次编辑下。