我无法理解这是如何工作的。我已经阅读了很多关于它的帖子 - 例如 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 - 我在上面期望的行为)。
但是,我注意到当我将代码更改为使用 [tableView dequeueReusableCellWithIdentifier:]
时,它会创建一个新单元格,并且其 contentView.frame
的宽度为320(全宽)。之前,当我执行 dequeue...forIndexPath
时,它会给出 302 的宽度,或者单元格的视觉/“实际”宽度。这是为什么?
还有,有没有办法指定注册重用的 UITableViewCells 的样式?
解决方案:所以我找到了这个线程UITableView cell.contentView.bounds.size.width Changes With Cell Reuse ,它表示当您将 autoresizingmask 设置为 UIViewAutoresizingFlexibleLeftMargin 时,它在您尝试进行相对定位时是固定的(contentView 宽度最初是完整宽度,但当您呈现它时它会缩小,所以如果您正确计算它仍然会显示正确设置)。
我在右侧放置了一个 UISwitch - 当我设置自动调整大小蒙版时,它在首次显示时起作用,但在我切换它时又移动了大约 20 像素。我不知道是什么导致了额外的偏移,但我最终通过简单地将 UISwitch 设置为单元格的 accessoryView 来解决它。
(这与最初的问题部分偏离了主题,但如果有人无意中发现了这一点,它可能会有用)。对于任何特别想知道原始问题的人,答案在第一次编辑下。
最佳答案
当您调用 [tableView registerClass: forCellReuseIdentifier:]
时,您是在教 TableView 在您稍后使用指定的 ReuseIdentifier
时该怎么做。因此,当您稍后调用 [tableView dequeueReusableCellWithIdentifier:]
时,它会:
一个。获取之前创建但当前未使用的单元格
或
B.创建您指定类的新单元格
所以,当你出队时,你总是会得到一个实例。如果您想使用 initWithStyle:reuseIdentifier:
自己创建新的单元格实例,那么您不应该向 TableView 注册一个类。或者,保留注册并添加逻辑以指定需要配置的所有内容(并考虑使用多个不同的单元类和重用标识符)。
关于ios - 了解 UITableView dequeueReusableCellWithIdentifier - 即使在第一次调用时也返回单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17176969/