55: Bookworm, part 3

그루두·2024년 7월 1일
0

100 days of SwiftUI

목록 보기
63/108

100 days of swiftui: 55

ModelConfiguration

swiftData에 저장된 데이터를 인수로 활용하는 View에서 preview를 설정하기 위해선 정해진 절차가 필요하다. 아래는 예시로 modelContext에 저장된 Book을 인수로 받는 DetailView의 Preview를 설정하는 방법이다.

  1. model context를 생성해야 한다.
  2. 그 model context는 model container를 생성하는 과정에서 비롯되어야 한다.
  3. 그 model container는 실제로 데이터를 저장하는 게 아니라 model configuration(temporary in-memory storage)을 생성해 임시임을 알려줘야 한다.
#Preview {
    do {        
        let config = ModelConfiguration(isStoredInMemoryOnly: true)
        let container = try ModelContainer(for: Book.self, configurations: config)
        let example = Book(title: "Test Title", author: "Test Author", genre: "Mystery", rating: 3, review: "This book was fun enough. But i didn't expect to be fun..")
        return DetailView(book: example)
    } catch {
        return Text("Error: Failed to create preview. \(error.localizedDescription)")
    }
}

깃헙 링크

Query 정렬하기

Book 객체가 저장된 query를 여러 가지 방법으로 정리할 수 있다.

  • 제목 알파벳 순서대로
@Query(sort: \Book.title) var books: [Book]

// 혹은
@Query(sort: [SortDescriptor(\Book.title)]) var books: [Book]
  • 작가 알파벳 반대 순서대로
@Query(sort: \Book.author, order: .reverse) var books: [Book]

// 혹은
@Query(sort: [SortDescriptor(\Book.author)]) var books: [Book]
  • 제목 알파벳 순서대로, 그리고 작가 알파벳 반대 순서대로
    @Query(sort: [
        SortDescriptor(\Book.title),
        SortDescriptor(\Book.author, order: .reverse)
    ]) var books: [Book]

깃헙 링크

delete, edit 추가하기

List에서 만들어진 Book을 슬라이드하여 삭제하거나 edit mode를 통해 삭제할 수 있도록 했다.

해당 index의 정보로 책 객체를 찾아 model context에서 삭제한다.

    func deleteBooks(at offsets: IndexSet) {
        for offset in offsets {
            let book = books[offset]
            modelContext.delete(book)
        }
    }

깃헙 링크

해당 Book 삭제하기

마지막으로 DetailView의 navigation에 삭제 버튼을 만들고, 이 버튼을 클릭하면 취소, 삭제 옵션 버튼을 만들어 삭제할 수 있도록 설정했다.

깃헙 링크

profile
계속 해보자

0개의 댓글

관련 채용 정보