我对斯威夫特、迅捷和coredata完全陌生。我有很好的编程经验,在其他语言,但迅速是自己的世界。:-)
重要信息:这是给macOS而不是iOS的!!
我的问题是:我想在一个显示在工作表中的单独视图中编辑一个数据集。我遵循了这个示例(SwiftUI update view on core data object change),但是在尝试运行时,我的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)
}
}发布于 2022-05-29 04:45:58
首先:谢谢你所有的好提示。最后,我可以用
@ObservedObject var aBook: Books
在我的EditView开始时。
按钮本身有以下代码
Button {
showingEditScreen.toggle()
} label: {
Label("", systemImage: "pencil")
}.sheet(isPresented: $showingEditScreen) {
EditBookView(aBook: book).environment(\.managedObjectContext, self.viewContext)
}
这样,我就可以将单个图书项目的整个图书对象发送到编辑视图中,并且可以使用它。
https://stackoverflow.com/questions/72417620
复制相似问题