UITableView.reload 将旧单元格留在 TableView 中但隐藏了
UITableView.reload leaves old cells in TableView but hidden
我有一个 UITableView 用于显示搜索结果。当我打字时,我正在呼叫 Tableview.reloadData()
。从视觉上看,一切正常。当我开始输入时,我最多显示 5 个匹配项,当我低于该匹配项时,列表将正确显示更少的项目。以下是单元格的创建方式和报告的行数。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "placeCell") as! PlaceCell
if shouldShowSearchResults {
let place = filteredPlaces[indexPath.row]
cell.dataSource = place
} else {
let place = allPlaces[indexPath.row]
cell.dataSource = place
}
cell.delegate = self
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if shouldShowSearchResults {
vlog?.debug("Number of FILTERED rows in PlacesTableView: \(filteredPlaces.count)")
return filteredPlaces.count
} else {
vlog?.debug("Number of unfiltered rows in PlacesTableView: \(allPlaces.count)")
return allPlaces.count
}
}
由于 PlaceCell 是自定义的 class,这里有一些细节:
// I've omitted labels, etc.
class PlaceCell: UITableViewCell {
var dataSource : PlaceView? {
didSet {
if let ds = dataSource {
self.isAccessibilityElement = true
self.accessibilityLabel = ds.getAccessibilityLabel()
} else {
self.isAccessibilityElement = true
self.accessibilityLabel = nil
}
}
}
weak var delegate : PlaceCellDelegate? = nil
override func prepareForReuse() {
self.isAccessibilityElement = false
self.accessibilityLabel = nil
super.prepareForReuse()
}
}
当使用 Google 的 Earl Gray 进行的 UI 测试由于多个单元格具有相同的辅助功能标签而开始失败时,我开始注意到一个问题。从视觉上看,我不明白为什么会失败,因为只有一个匹配的可见单元格。
使用 Reveal 检查视图后,似乎随着单元格的数量下降到最大值 5 以下,旧单元格仍在 TableView 中,但被隐藏了。所以有一个隐藏的单元格曾经显示与不同单元格显示的相同的数据。
知道为什么会这样吗?这已经工作了几个月,我不确定发生了什么变化。
遍历视图层次总是很危险的;事情可以改变,也许这就是这里发生的事情。
无论如何,您可以通过使用 grey_sufficientlyVisible
只选择具有所需标签的可见项目来使您的测试更加稳健
类似于:
grey_allOf(grey_accessibilityLabel("Whole Foods Market, East Mayo Boulevard, Phoenix"), grey_sufficientlyVisible(), nil)
我有一个 UITableView 用于显示搜索结果。当我打字时,我正在呼叫 Tableview.reloadData()
。从视觉上看,一切正常。当我开始输入时,我最多显示 5 个匹配项,当我低于该匹配项时,列表将正确显示更少的项目。以下是单元格的创建方式和报告的行数。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "placeCell") as! PlaceCell
if shouldShowSearchResults {
let place = filteredPlaces[indexPath.row]
cell.dataSource = place
} else {
let place = allPlaces[indexPath.row]
cell.dataSource = place
}
cell.delegate = self
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if shouldShowSearchResults {
vlog?.debug("Number of FILTERED rows in PlacesTableView: \(filteredPlaces.count)")
return filteredPlaces.count
} else {
vlog?.debug("Number of unfiltered rows in PlacesTableView: \(allPlaces.count)")
return allPlaces.count
}
}
由于 PlaceCell 是自定义的 class,这里有一些细节:
// I've omitted labels, etc.
class PlaceCell: UITableViewCell {
var dataSource : PlaceView? {
didSet {
if let ds = dataSource {
self.isAccessibilityElement = true
self.accessibilityLabel = ds.getAccessibilityLabel()
} else {
self.isAccessibilityElement = true
self.accessibilityLabel = nil
}
}
}
weak var delegate : PlaceCellDelegate? = nil
override func prepareForReuse() {
self.isAccessibilityElement = false
self.accessibilityLabel = nil
super.prepareForReuse()
}
}
当使用 Google 的 Earl Gray 进行的 UI 测试由于多个单元格具有相同的辅助功能标签而开始失败时,我开始注意到一个问题。从视觉上看,我不明白为什么会失败,因为只有一个匹配的可见单元格。
使用 Reveal 检查视图后,似乎随着单元格的数量下降到最大值 5 以下,旧单元格仍在 TableView 中,但被隐藏了。所以有一个隐藏的单元格曾经显示与不同单元格显示的相同的数据。
知道为什么会这样吗?这已经工作了几个月,我不确定发生了什么变化。
遍历视图层次总是很危险的;事情可以改变,也许这就是这里发生的事情。
无论如何,您可以通过使用 grey_sufficientlyVisible
类似于:
grey_allOf(grey_accessibilityLabel("Whole Foods Market, East Mayo Boulevard, Phoenix"), grey_sufficientlyVisible(), nil)