ios - 了解 UITableView dequeueReusableCellWithIdentifier - 即使在第一次调用时也返回单元格

标签 ios objective-c uitableview

我无法理解这是如何工作的。我已经阅读了很多关于它的帖子 - 例如 UITableView dequeueReusableCellWithIdentifier TheoryHow 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/

相关文章:

ios - 安全的 UITextField 文本颜色

ios - 添加 UITextField 会卡住应用程序

ios - 按下 uiview 会使灰色背景 swift 出现

ios - 本地化的 UISegmentedControl

ios - MVC : should i add and implement touch gestures in the View Controller or my custom subclass of UIView

ios - 为什么我安装的所有应用程序都没有显示在 iOS 版 Parse.com 中?

iOS-将图像制作为视频时,CVPixelBufferCreate 内存无法正确释放

uitableview - 在 iOS 10 上使用 UISearchController 和 UITableViewController 时,UITableView header 处出现奇怪的空白

ios - numberOfItemsInSection的逻辑问题:

ios - 使用 UIDocumentPickerViewController 选择文件时如何启用多个文件选择?