【问题标题】:UITableViewCell missing deletion control after successive left-swipesUITableViewCell 连续左滑后缺少删除控件
【发布时间】:2021-08-02 10:03:41
【问题描述】:

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

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

现在(例如),当我向左滑动单元格 0,然后向左滑动单元格 1 时,单元格 0 中的 Delete 操作按钮仍然可见,使用 Edit 按钮激活编辑模式现在会向左显示删除命令并重新排序所有单元格的控制权,除了(!)单元格 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"
}

在所有涉及的方法之上。不相关的方法内容被省略以保持帖子紧凑。如果认为需要,我会添加/编辑。


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


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

【问题讨论】:

  • 能否请您发布一些带有错误的屏幕截图,否则很难想象发生了什么。

标签: swift uitableview uitableviewrowaction


【解决方案1】:

我找到了不当行为的原因。由于我在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 Bookmarks 表格视图的行为方式相同。向左滑动单元格 0,然后向左滑动单元格 1,然后按两次Done/Edit 按钮(右下角)。您可以观察到单元格 0 没有显示单元格 0 左侧的删除控制图标(单向标志)。因此我认为这是一个 iOS 错误。

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

【讨论】:

    【解决方案2】:

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

    navigationItem.leftBarButtonItem = self.editButtonItem
    

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

    【讨论】:

    • 感谢您的回复,但不……您的建议不起作用。这已经是我在此处发布之前尝试过的曲目的一部分。我又试了一次,可以确认它不起作用。同时......我很确定这种不当行为始于第一个单元格没有被右滑(=取消该特定单元格的编辑模式)。当我手动执行此操作时,它可以工作。但是当我把它留给 tableviewcell 逻辑时,它就不起作用了。同样,当我向左滑动第二个单元格时,第一个单元格编辑模式光学禁用,但我认为它不会逻辑上禁用。
    • 你删除了editing和setEditing方法吗?这些不是必需的,因为它们在使用 editButtonItem 时会自动传递。如果没有,那么我建议尝试在没有您当前使用的编辑方法的情况下使用 editButtonItem。
    • Xcode 需要使用 setEditing() 方法覆盖(如果未使用覆盖,则会出错)。但是我可以完全省略这个方法。没有现在一切正常,即使不使用editButtonItem
    • 对不起,我没有正确地澄清,我的意思是删除整个两个方法,然后只使用 editButtonItem。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 2016-07-27
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多