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)