web-dev-qa-db-ja.com

iOS 13のdiffableデータソースを使用して、テーブルビューでスワイプして削除できない

新しい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])
}

しかし、これはUITableViewControllerがあるUITableViewDiffableDataSourceでは機能しません

スワイプはなく、メソッド内のブレークポイントも呼び出されません

これはベータ版のバグだと思っていましたが、Xcode 11に更新しましたGMそして同じことが起こっています。

アドバイスをありがとう

9
DogCoffee

これを有効にしたい行のUITableViewDiffableDataSourceをサブクラス化してtrueを返す必要があります。

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

tableView(_:canEditRowAt:) のドキュメントが次のように言っているのは事実です。

このメソッドにより、データソースは個々の行を編集可能として扱われることから除外できます。編集可能な行は、セルに挿入または削除のコントロールを表示します。このメソッドが実装されていない場合、すべての行が編集可能であると見なされます

ただし、UITableViewDiffableDataSourcedoesはそのメソッドを実装しており、デフォルトでfalseを返すようです(ただし、それはどこにでも文書化されています)。

実際、WWDC 2019セッション215および220の サンプルコード は、次のようなカスタムUITableViewDiffableDataSourceサブクラスを実装しています。

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