반응형

Hacking with Swift 사이트의 강좌 번역본입니다.

 

[원문 : https://www.hackingwithswift.com/quick-start/swiftui/how-to-delete-core-data-objects-from-swiftui-views]

 

How to delete Core Data objects from SwiftUI views

 

SwiftUI에서 Core Data 객체를 삭제하는 것은 UIKit에서 삭제하는 것과 거의 같으며, SwiftUI 의 뷰와 통합하기 위해 이동하는 특별한 것들이 있습니다.

 

Core Data와 SwiftUI 설정 지침을 따르는 경우, 이미 관리 객체 컨텍스트가 SwiftUI environment에 추가되어 있습니다.

 

관리 객체 컨텍스트가 있는 경우에, SwiftUI 뷰가 다음과 같은 프로퍼티를 사용할수 있도록 하세요.

@Environment(\.managedObjectContext) var managedObjectContext

 

다음으로, 관리 객체 컨텍스트에서 약간의 데이터를 읽는 가져오기 요청을 만듭니다. 예제 설정에 ProgrammingLanguage 엔티티(entity)가 있으므로, 다음과 같이 모든 항목들을 읽을 수 있습니다.

@FetchRequest(
    entity: ProgrammingLanguage.entity(),
    sortDescriptors: [
        NSSortDescriptor(keyPath: \ProgrammingLanguage.name, ascending: true),
    ]
) var languages: FetchedResults<ProgrammingLanguage>

 

세번재, 데이터를 보여줄때마다 SwiftUI 뷰에 onDelete modifier를 추가합니다. 예를들어, 다음과 같이 위의 가져오기 요청을 사용해서 ForEach를 사용해서 목록을 만들수 있습니다.

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

 

마지막으로, SwiftUI 뷰에 removeLanguages() 메소드를 추가하세요. 삭제되야하는 고유한 정수형 인덱스의 모음인, IndexSet를 사용해야합니다.

func removeLanguages(at offsets: IndexSet) {
    for index in offsets {
        let language = languages[index]
        managedObjectContext.delete(language)
    }
}

 

여기에서 Core Data 컨텍스트를 저장하고 싶을수 있으며, for 반복문이 끝나면 다음과 같이 추가하세요.

do {
    try managedObjectContext.save()
} catch {
    // handle the Core Data error
}

 

onDelete modifier을 추가해서 테이블 행에서 스와이프(swipe)해서 삭제할 수 있지만, Edit/Done 버튼으로 편집 모드를 전환하려면 NavigationView 내부에 있는 모든 항목에 다음 modifier를 추가해야 합니다.

.navigationBarItems(trailing: EditButton())

 

반응형
Posted by 까칠코더
,