连续向左滑动后 UITableViewCell 缺少删除控件

UITableViewCell missing deletion control after successive left-swipes

我使用带有可编辑自定义样式单元格的表格视图。导航栏中有一个 Edit 按钮,用于切换编辑模式。我需要编辑模式来删除和重新排序行。

当我向左滑动单元格时,Delete 操作按钮会显示在该单元格的右侧。当它显示时,我按下 Edit 按钮,Delete 操作按钮消失。再次按下 Edit 按钮会在左侧显示删除命令,在所有 (!) 单元格的右侧显示重新排序控件。目前一切如预期。

现在(例如),当我向左滑动单元格 0,然后向左滑动单元格 1 时,单元格 0 中的 Delete 操作按钮仍然可见,使用 Edit 激活编辑模式按钮现在显示左侧的删除命令和右侧的所有单元格的重新排序控制,EXCEPT(!) 单元格 0。

我发现一旦 2 个或更多单元格被左划,第一个没有右划回退出编辑模式的单元格,当所有单元格的编辑模式为使用 Edit 按钮启用。更奇怪的是...主题单元格缺少删除控件(左),重新排序控件(右)显示正确!

我遵循并比较了很多教程,但没有发现错误。

我错过了什么?

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    ...
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    ...
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    ...
}

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    ...
}

override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
    ...
}

override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
    ...
}

// not necessary = didn't change anything, but found in many tutorials
override func setEditing(_ editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: animated)
}

@IBAction func editAction(_ sender: Any) { // that's the Edit button action
    self.setEditing(!isEditing, animated: true)
    self.navigationItem.leftBarButtonItem?.title = isEditing ? "Done" : "Edit"
}

以上所有涉及的方法。省略不相关的方法内容以保持 post 紧凑。如果需要,我会add/edit。


向左滑动单元格 1 后查看(忽略 RenameShare 操作)。


向左滑动单元格 2 后查看,然后是单元格 1,然后使用 Edit 按钮进入编辑模式。

您好,我相信您的问题可以通过使用 UITableView 的预设来解决 editButtonItem

navigationItem.leftBarButtonItem = self.editButtonItem

这会在执行滑动操作时将按钮状态设置为 编辑 模式,因此应该可以解决您遇到的问题。

我找到了不当行为的原因。由于我在 setEditing() 方法中使用了动画,因此我需要使用 beginUpdates()endUpdates() 告诉视图有更新。成功了!不再有显示不佳的单元格,无论是模拟器还是设备!

@IBAction func editAction(_ sender: Any) {
    tableView.beginUpdates()
    self.setEditing(!isEditing, animated: true)
    tableView.endUpdates()
    self.navigationItem.leftBarButtonItem?.title = isEditing ? "Done" : "Edit"
}

编辑 1

以上(beginUpdates()endUpdates())可以正常工作,但以下(performBatchUpdates {})更现代(iOS 11.0),应该是首选。

@IBAction func editAction(_ sender: Any) {
    tableView.performBatchUpdates {
        self.setEditing(!isEditing, animated: true)
    }
    self.navigationItem.leftBarButtonItem?.title = isEditing ? "Done" : "Edit"
}

编辑 2

同时我认为 OP 的不当行为是一个 iOS 错误。

一个偶然的机会,我发现 Safari 书签表视图的行为方式相同。向左滑动单元格 0,然后向左滑动单元格 1,然后按 Done/Edit 按钮(右下角)两次。您可以观察到单元格 0 没有显示单元格 0 左侧的删除控制图标(单向符号)。因此我认为这是一个 iOS 错误。

除此之外,其他应用程序在编辑表格视图时也会产生同样的错误行为。