如何使用核心数据将对象传递给 SwiftUI 中的其他视图

Posted

技术标签:

【中文标题】如何使用核心数据将对象传递给 SwiftUI 中的其他视图【英文标题】:How to pass object to other view in SwiftUI with core data 【发布时间】:2020-11-10 11:00:44 【问题描述】:

我正在尝试使用 SwiftUI 中的核心数据进行简单的 CURD 操作。我已经用谷歌搜索了,但没有成功。

我已经成功实现了创建操作。现在我正在尝试实现“编辑”操作。对于编辑操作,我想将一个对象传递给第二个视图。

我正在尝试什么:

//ContentView

struct ContentView: View 
    
    @Environment(\.managedObjectContext) var managedObjectContext
    
    @FetchRequest(entity: StudentCoreData.entity(),sortDescriptors: [])
   
    var students: FetchedResults<StudentCoreData>
    @State var showAddStudentSheet = false

    var body: some View 
        
         NavigationView
            VStack
                
                    List 
                        ForEach(self.students, id: \.id)  student in
                            NavigationLink(destination: AddStudent())
                            
                                Text(student.name ?? "Unknown")
                            
                        
                    
            
            .navigationBarTitle("students")
            .navigationBarItems(trailing: Button(action: 
                //  self.showAddStudentSheet = true
                self.showAddStudentSheet.toggle()
            , label: 
                Text("Add")
            ))
                .sheet(isPresented: $showAddStudentSheet) 
                    AddStudent().environment(\.managedObjectContext, self.managedObjectContext)
            
            
        
    


 
struct ContentView_Previews: PreviewProvider 
    
    static var previews: some View 
        
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        
        return ContentView().environment(\.managedObjectContext, context)
    



//And AddStudent View
struct AddStudent : View 
    
    @Environment(\.managedObjectContext) var managedObjectContext
    @Environment (\.presentationMode) var presentationMode
    
    @State var studentName = ""

    var body: some View
    
        
        NavigationView
            
                Form
                    
                        
                        Section(content: 
                            
                            Text("Student Details")
                                .font(.headline)
                                .fontWeight(.medium)
                                .multilineTextAlignment(.leading)
                                .padding(.leading, 5.0)
                            TextField("Name", text: $studentName)
                                .padding(.all, 16.0)
                            
                        )
                        
                        
                        Section(content: 
                            Button(action: 
                                guard self.studentName != "" else return
                                let newOrder = StudentCoreData(context: self.managedObjectContext)
                                newOrder.name = self.studentName
                                newOrder.id = UUID()
                                do 
                                    try self.managedObjectContext.save()
                                    print("Order saved.")
                                    self.presentationMode.wrappedValue.dismiss()
                                 catch 
                                    print(error.localizedDescription)
                                
                                
                            ) 
                                Text("Click me")
                                    .font(.system(size: 18))
                                    .multilineTextAlignment(.center)
                            
                            .frame(minWidth: 0, maxWidth: .infinity, alignment: .center)
                            
                        )
                
                .navigationBarTitle("Add Student")
                .navigationBarItems(leading:  Button(action: 
                    self.presentationMode.wrappedValue.dismiss()

                , label: 
                    Text("Cancel")
                ))
        
        
        
    


struct AddStudent_Previews: PreviewProvider 
    static var previews: some View 
        AddStudent()
    

我想在表格列表的点击行上传递学生对象。

我想知道如何传递变量。如何在“添加学生”视图中创建这个变量,因为如果我创建一个新变量,它会反映在调用 AddStudent 类的所有地方,然后新的问题就来了。

请帮忙。

【问题讨论】:

【参考方案1】:

您可以使用@StateObject 传递它

   struct AddStudent : View 

      @StateObject var student:Student

    init(student:Student) 
    _student = StateObject(wrappedValue:student)
    
    

.....继续你的结构

在导航链接中您选择的学生

 NavigationLink(destination: AddStudent(student:Student))

【讨论】:

【参考方案2】:

从表格列表中获取相应的对象,并将其注入到自定义编辑视图中

let selectedObject = //...fetch from coredata or from a cached dataset... editView.objectToEdit = selectedObject

【讨论】:

是的,我知道。我想知道如何传递该变量。如何在“添加学生”视图上创建这个变量,因为如果我创建一个新变量,它会反映在调用 AddStudent 类的所有地方,然后新问题就来了。 试试这个指南,查找“更新订单”部分:blckbirds.com/post/core-data-and-swiftui 我关注了 blckbird 项目,但它没有将变量传递给另一个视图。 有什么解决办法吗?

以上是关于如何使用核心数据将对象传递给 SwiftUI 中的其他视图的主要内容,如果未能解决你的问题,请参考以下文章

如何将对象传递给 innerHTML (JavaScript) 中的函数?

如何将对象传递给其他组件,路由更改数据正在被清除

使用 v-for 将对象传递给组件

将对象传递给 Java 中的不同库

检测何时将对象传递给 C++ 中的新线程?

如何通过NodeJS将对象传递给前端