【问题标题】:Tableview cell not being recycled when it contains the first responder当 Tableview 单元包含第一响应者时,它没有被回收
【发布时间】:2020-04-24 20:19:42
【问题描述】:

我有一个UITableView,里面有大约 30 个项目。行高是静态的,根据 tableview 的大小,在任何给定时间大约存在 8 个单元格。每个单元格都有一个UITextField,就是这样。令人困惑的部分是,当我开始编辑时,假设第 0 行单元格中的文本字段。发生的情况是一切都按我预期的那样工作,直到该行滚动不可见(而其文本字段仍然是第一响应者)。我希望下一行的单元格也有一个带有第一响应者状态的文本字段,因为它是刚刚被编辑的单元格,但被回收到另一行——这永远不会发生。

第 0 行的单元格继续保持第一响应者状态。我知道这一点,因为我在一直滚动到底部时继续输入(第一行的单元格通常会在那时被回收),一旦滚动回顶部,我输入的内容在第 0 行的单元格中很明显。

要明确这是我想要的行为,但我没有在任何地方找到它的记录,所以它让我厌倦了依赖它。输入到单元格文本字段中的文本存储为模型的name 属性,如果用户认为他们正在编辑第 0 行的模型名称,但由于未来对 iOS 的更改,就会出现奇怪的行为SDK,他们最终实际上在他们键入时单元格恰好位于的任何行编辑模型的名称。

【问题讨论】:

  • 您真的希望用户在文本字段被滚动到视野之外时继续编辑它吗?
  • @DonMag 这不是重点。关键是,在目前的情况下,他们可以——因为 Apple 的 UITableView 实现。我不知道为什么用户会这样做,但我的选择是什么?滚动出视图时结束对文本字段的编辑? — 惊喜用户!键盘往下走。也许他们只是向下滚动以检查列表中另一个项目中的文本。也许我们可以在不摆脱键盘的情况下阻止编辑。实现UITextFieldDelegate?
  • 当然可以,但是当我想要的行为已经明确实现并且我所需要的只是确认它被官方认可时,为什么还要这样做。
  • 在滚动时关闭键盘并非没有道理。事实上,有一个专门为此设计的属性:keyboardDismissMode
  • @shoe - 我问了,因为你说 “要明确这是我想要的行为” ...使用应用程序并输入信息会让我感到惊讶进入我看不见的领域。如果这是您想要的行为,我不是在批评,只是在评论。

标签: ios uitableview


【解决方案1】:

我假设 Apple 添加了 .keyboardDismissMode 以使文本字段更容易(自动)辞职。

来自 Apple 的文档dequeueReusableCell(withIdentifier:)

表视图维护一个队列或UITableViewCell 对象列表,数据源已标记为重复使用。

这似乎表明,在某些情况下(例如本例),UITableViewCell 对象将可供重用。

我们可以至少通过检查队列和可见单元格来确认这一点:

print(tableView.value(forKey: "_reusableTableCells"))
tableView.visibleCells.forEach {
    print($0)
}

如果我们在上下滚动时查看此内容,我们可以看到正在使用的单元格被放入队列中。

但是,如果开始编辑单元格中的字段,然后滚动而不退出,我们会看到特定单元格没有进入重用队列.

这是否意味着这种行为永远不会改变?我不能告诉你。

但是,将这些信息与 UITextFieldresignFirstResponder 仅通过将其定位在其父视图的框架/边界之外这一事实相结合,让我相信这种行为是设计使然。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多