我對 swift、swiftui 和 coredata 完全陌生。我在其他語言方面有很好的編程經驗,但 swift 是它自己的世界。:-)
重要資訊:它適用于 macOS 而不是 iOS!
我的問題:我想在作業表中顯示的單獨視圖中編輯資料集。我按照這個例子(核心資料物件更改的 SwiftUI 更新視圖),但是在嘗試運行時,我的 NSManagedObjectID 始終為零。
ContentView(縮短)
import SwiftUI
import CoreData
struct ContentView: View {
@State public var selectedBookId: NSManagedObjectID?
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Books.title, ascending: true)],
animation: .default)
private var books: FetchedResults<Books>
@State private var showingEditScreen = false
var body: some View {
NavigationView {
List {
ForEach(books, id: \.self) { book in
HStack {
NavigationLink {
HStack {
Button {
// here store objectID to var
selectedBookId = book.objectID
showingEditScreen.toggle()
} label: {
Label("", systemImage: "pencil")
}
}
.padding(10.0)
} label: {
Text(book.title!)
}
}
}.onDelete(perform: deleteBooks)
}
.toolbar {
ToolbarItem(placement: .automatic) {
// here goes blabla
}
}
Text("Bitte zuerst ein Buch ausw?hlen!")
}
.sheet(isPresented: $showingEditScreen) {
// Run EditBookView an send bookId
EditBookView(bookId: selectedBookId).environment(\.managedObjectContext, self.viewContext)
}
}
}
我的 EditView 看起來像這樣
import SwiftUI
struct EditBookView: View {
@Environment(\.managedObjectContext) var moc
@Environment(\.dismiss) var dismiss
var bookId: NSManagedObjectID! // This is allways nil!!
var book: Books {
moc.object(with: bookId) as! Books
}
@State private var title = ""
@State private var review = ""
var body: some View {
Form {
Text("Edit Book").font(.title)
Spacer()
Section {
TextField("Buchname", text: $title)
TextEditor(text: $review)
} header: {
Text("Schreibe eine Zusammenfassung")
}
Spacer()
Section {
HStack {
Button("Save") {
// add the book
// here code for update
try? moc.save()
dismiss()
}
Button("Cancel") {
print(bookId) // shows "nil"
dismiss()
}
}
}
Spacer()
}
.onAppear {
self.title = self.book.title ?? ""
self.review = self.book.review ?? ""
}
.padding(10.0)
}
}
uj5u.com熱心網友回復:
首先:感謝所有好的提示。最后,我可以使用
@ObservedObject var aBook: Books
在我的 EditView 的開頭。
按鈕本身有以下代碼
Button {
showingEditScreen.toggle()
} label: {
Label("", systemImage: "pencil")
}.sheet(isPresented: $showingEditScreen) {
EditBookView(aBook: book).environment(\.managedObjectContext, self.viewContext)
}
這樣,我可以將單個書籍專案的整個書籍物件發送到編輯視圖并且我可以使用它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/484510.html
