如何使用核心数据将对象传递给 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 中的其他视图的主要内容,如果未能解决你的问题,请参考以下文章