返回

SwiftUI 100天 Bookworm-part9 删除 Core Data 对象

IOS

[1] 删除书籍

要删除书籍,我们将在 ContentView 中使用 onDelete(perform:) 修饰符。这个修饰符接受一个闭包作为参数,该闭包将要被删除的书籍作为参数,我们可以使用此闭包来从 Core Data 中删除书籍。

// ContentView.swift

import SwiftUI
import CoreData

struct ContentView: View {
  @Environment(\.managedObjectContext) private var context

  @FetchRequest(
    entity: Book.entity(),
    sortDescriptors: [
      NSSortDescriptor(keyPath: \Book.title, ascending: true)
    ]
  ) private var books: FetchedResults<Book>

  var body: some View {
    List {
      ForEach(books, id: \.self) { book in
        HStack {
          Text(book.title ?? "Unknown")

          Spacer()

          Button(role: .destructive) {
            context.delete(book)
            try? context.save()
          } label: {
            Image(systemName: "trash")
          }
        }
      }
      .onDelete(perform: deleteBooks)
    }
  }

  private func deleteBooks(offsets: IndexSet) {
    withAnimation {
      offsets.map { books[$0] }.forEach(context.delete)

      try? context.save()
    }
  }
}

[2] 编辑书籍

要编辑书籍,我们将在 ContentView 中使用 NavigationLinkBookDetailViewNavigationLink 将我们带到 BookDetailView,在那里我们可以编辑书籍的标题和作者。

// ContentView.swift

import SwiftUI
import CoreData

struct ContentView: View {
  @Environment(\.managedObjectContext) private var context

  @FetchRequest(
    entity: Book.entity(),
    sortDescriptors: [
      NSSortDescriptor(keyPath: \Book.title, ascending: true)
    ]
  ) private var books: FetchedResults<Book>

  var body: some View {
    List {
      ForEach(books, id: \.self) { book in
        NavigationLink {
          BookDetailView(book: book)
        } label: {
          Text(book.title ?? "Unknown")
        }
      }
    }
  }
}
// BookDetailView.swift

import SwiftUI
import CoreData

struct BookDetailView: View {
  @Environment(\.managedObjectContext) private var context

  @ObservedObject var book: Book

  var body: some View {
    Form {
      TextField("Title", text: $book.title)
      TextField("Author", text: $book.author)

      Button("Save") {
        try? context.save()
      }
    }
  }
}

通过添加这些修改,我们就可以实现一个功能齐全的书架应用程序,允许用户添加、删除和编辑书籍。