首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将NSManagedObjectID发送到结构/视图

将NSManagedObjectID发送到结构/视图
EN

Stack Overflow用户
提问于 2022-05-28 17:02:51
回答 1查看 100关注 0票数 2

我对斯威夫特、迅捷和coredata完全陌生。我有很好的编程经验,在其他语言,但迅速是自己的世界。:-)

重要信息:这是给macOS而不是iOS的!!

我的问题是:我想在一个显示在工作表中的单独视图中编辑一个数据集。我遵循了这个示例(SwiftUI update view on core data object change),但是在尝试运行时,我的NSManagedObjectID总是为零。

ContentView (简称)

代码语言:javascript
复制
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看起来像这样

代码语言:javascript
复制
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)
        
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-29 04:45:58

首先:谢谢你所有的好提示。最后,我可以用

代码语言:javascript
复制
@ObservedObject var aBook: Books

在我的EditView开始时。

按钮本身有以下代码

代码语言:javascript
复制
Button {
    showingEditScreen.toggle()
} label: {
    Label("", systemImage: "pencil")
}.sheet(isPresented: $showingEditScreen) {
    EditBookView(aBook: book).environment(\.managedObjectContext, self.viewContext)
}

这样,我就可以将单个图书项目的整个图书对象发送到编辑视图中,并且可以使用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72417620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档