【问题标题】:Unable to swipe to delete with tableview using diffable data source in iOS 13无法使用 iOS 13 中的 diffable 数据源使用 tableview 滑动删除
【发布时间】:2020-01-13 19:40:32
【问题描述】:

我正在更新 UITableViewController 以使用新的 UITableViewDiffableDataSource,除了滑动删除之外,我一切正常。

这是我如何使用滑动删除的示例

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {

   let lockedAction = UIContextualAction(style: .normal, title: "TEST") { (_, _, completion) in
       print("tapped....")
       completion(true)
   }

    return UISwipeActionsConfiguration(actions: [lockedAction])
}

但这不适用于具有UITableViewDiffableDataSourceUITableViewController

没有滑动,方法中的断点也不会被调用

我认为这是一个 beta 错误,但我更新到 Xcode 11 GM 并且同样的事情正在发生。

感谢您的建议

【问题讨论】:

  • 我有同样的问题,并使用反馈助手提交了错误报告。据我所知,这是某种 iOS 错误。

标签: swift uitableview ios13 diffabledatasource


【解决方案1】:

您应该继承 UITableViewDiffableDataSource 并返回 true 为您要启用此功能的行:

override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool

【讨论】:

  • 这并不能解决问题。 “该方法允许数据源排除单个行被视为可编辑。可编辑行在其单元格中显示插入或删除控件。如果未实施此方法,则假定所有行都是可编辑的”感谢您的帮助。
  • @DogCoffee 你试过我的解决方案了吗? Apple 的文档在谈到 iOS 13 中引入的新的 diffable 数据源时并不准确。它们的默认实现似乎返回 false 并假定它们不可是可编辑的。
  • 作品 - 干得好...我会在 23 小时内解锁时向您发送奖金 50 :)
  • 这确实有效。这很烦人......我花了一个小时搞砸了,直到我开始在我的谷歌搜索中添加 iOS 13 并找到了这个找到的堆栈页面。谢谢@AshCameron
  • 谢谢,也适用于我。 Apple 需要更新他们的文档。
【解决方案2】:

docs for tableView(_:canEditRowAt:) 说的是真的:

该方法允许数据源排除单个行,使其不被视为可编辑。可编辑行在其单元格中显示插入或删除控件。如果未实现此方法,则假定所有行都是可编辑的

但是UITableViewDiffableDataSource确实实现了该方法,并且默认情况下它似乎返回false(尽管我在任何地方都找不到该文档)。

事实上,来自 WWDC 2019 会议 215 和 220 的 sample code 实现了一个自定义的 UITableViewDiffableDataSource 子类,如下所示:

class DataSource: UITableViewDiffableDataSource<SectionType, ItemType> {
    // ... 
    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }
    // ...
}

【讨论】:

  • 在那个样本中,他们编辑的是快照而不是模型,这太疯狂了!
【解决方案3】:

如果你的自定义UITableViewDiffableDataSource类继承自另一个自定义UITableViewDiffableDataSource类,你需要在父类中实现trailingSwipeActionsConfigurationForRowAt方法,并在default实现,然后在child类中重写它,以便被调用:

父类:

class ParentDataSource: UITableViewDiffableDataSource<SectionType, ItemType> {
    // ... 

    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }

    func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        return nil
    }
    // ...
}

儿童班:

class ChildDataSource: ParentDataSource {
    // ... 
    override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let lockedAction = UIContextualAction(style: .normal, title: "TEST") { (_, _, completion) in
            print("tapped....")
            completion(true)
        }

        return UISwipeActionsConfiguration(actions: [lockedAction])
    }
    // ...
}

我遇到了同样的问题,这是唯一对我有用的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2012-03-17
    • 1970-01-01
    • 2018-11-12
    • 2019-05-30
    • 1970-01-01
    相关资源
    最近更新 更多