我有一个 UITableView
其中有大约30个项目。行高是静态的,根据tableview的大小,任何时候都有大约8个单元格存在。每个单元格有一个 UITextField
就是这样。令人困惑的是,当我开始编辑比如说第0行单元格中的文本字段时,所发生的一切都和我所期望的一样,直到该行被滚动到不可见为止(而它的文本字段仍然是第一响应者)。我希望下一行的单元格也能有一个第一响应者状态的文本字段,因为它是刚刚被编辑过的单元格,但却被回收到另一行--这从未发生过。
第0行的单元格继续保持第一响应者状态。我知道这一点是因为我在滚动到底部的同时继续输入(第一行的单元格通常在那时就已经被回收了),一旦滚动到顶部,我输入的内容在第0行的单元格中是显而易见的。
要说明的是,这是我想要的行为,但我没有在任何地方找到它的文档,所以这让我对依赖它感到厌倦。输入到单元格的文本字段的文本被存储为 name
属性,如果用户认为他们在第0行编辑模型的名称,但由于iOS SDK未来的变化,他们最终实际上在输入时单元格刚好在哪一行编辑模型的名称,就会出现奇怪的行为。
我假设苹果添加了 .keyboardDismissMode
以使文本字段的辞职更容易(自动)。
从苹果的文档中 dequeueReusableCell(withIdentifier:) :
一个表视图维护一个队列或列表的
UITableViewCell
对象,数据源已标记为重用。
这似乎表明,在某些情况下(比如这个), UITableViewCell
对象将 不 可供再利用。
我们 可以 至少可以通过检查队列和可见单元格来确认这一点。
print(tableView.value(forKey: "_reusableTableCells"))
tableView.visibleCells.forEach {
print($0)
}
如果我们在上下滚动时查看这个,我们可以看到正在使用的单元格。和 被放入队列中。
但是,如果在一个单元格中开始编辑一个字段,然后在不退出的情况下滚动,我们会看到那个特定的单元格确实有 不 会被放入重用队列。
这是否意味着这种行为永远不会改变?我无法告诉你。
但是,结合这些信息,再加上一个事实,即 UITextField
不 resignFirstResponder
仅仅通过将其定位在其上视图的框架范围之外,让我相信这种行为是设计出来的。