[SwiftUI]List화한 CoreData를 가로 스와이프로 행 삭제하는 방법

상당히 조사했지만 일본어 자료가 없었기 때문에 비망록으로 남겨 둔다.

하고 싶었던 일



아래와 같이 CoreData를 참조한 리스트를 가로 스와이프로 삭제하고 싶었다.
UI 요소뿐만 아니라 원본 데이터 당 삭제합니다.



잘 다른 페이지에서 보이는 이하와 같은 구현이라고 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)
    }
}

이상! !

좋은 웹페이지 즐겨찾기