2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[SwiftUI]List化したCoreDataを横スワイプで行削除する方法

Posted at

結構調べたけど、日本語の資料がなかったので備忘録として残しておく。

やりたかったこと

以下のようにCoreDataを参照したリストを横スワイプで削除したかった。
UIの要素だけでなく、元データごと削除する。

tobe.gif

よく他のページで見かける以下のような実装だとCoreDataの型が合わず処理がうまくいかない。

struct ContentView: View {
    @State private var data = ["one", "two", "three"]
 
    var body: some View {
        List {
            ForEach(data, id: \.self) { data in
                Text(data)
            }
            /// 行削除操作時に呼び出す処理の指定
            .onDelete(perform: rowRemove)
        }
    }
    
    /// 行削除処理
    func rowRemove(offsets: IndexSet) {
        data.remove(atOffsets: offsets)
    }
}

やったこと

1.CoreDataが使えるようになっているか以下の設定を確認する。

@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(
    entity: TestCoreData.entity(),
    sortDescriptors: [
        NSSortDescriptor(keyPath: \TestCoreData.name, ascending: true),
    ]
) var testCoreData: FetchedResults<TestCoreData>

2.以下のようなリストに対して.onDelete(perform:〜)を追加。

List {
    ForEach(testCoreData, id: \.self) { testCoreData in
        Text("Creator: \(testCoreData.creator ?? "Anonymous")")
    }.onDelete(perform: removeCoreData)
}

3.リストの番号を保持したoffsetsを使って、削除するCoreDataの要素を指定。

func removeCoreData(at offsets: IndexSet) {
    for index in offsets {
        let putTestCoreData = testCoreData[index]
        managedObjectContext.delete(putTestCoreData)
    }
}

以上!!

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?