通过@State 传递 NSManagedObject ...? SwiftUI
Posted
技术标签:
【中文标题】通过@State 传递 NSManagedObject ...? SwiftUI【英文标题】:Passing an NSManagedObject through @State...? SwiftUI 【发布时间】:2020-12-16 02:57:50 【问题描述】:我正在制作一个支持多个列表的列表应用程序,其中每个列表可以有多个项目。 (典型的提醒应用)
我相信我已经正确编写了添加新列表的代码,但我不确定如何将列表传递到“任务”视图 - 因为当我向列表添加新任务时,它不会更新看法。即虽然该项目实际上正在添加,但由于视图未刷新,因此看不到它。如果我离开视图并返回,则会看到添加的项目。
我使用@Binding 还是@State?怎么样?
录屏:https://drive.google.com/file/d/1YoMPkkTKTRSRVaHPSBve_FShAW73D0PL/view
显示所有列表的视图代码:
struct TaskListView: View
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(entity: TaskList().entity, sortDescriptors: [NSSortDescriptor(keyPath: \TaskList.name, ascending: true)])
private var lists: FetchedResults<TaskList>
var body: some View
List
ForEach(lists, id: \.self) list in
NavigationLink(destination: TaskItemsView(list: list))
Text(list.wrappedName)
.navigationBarItems(trailing: Button("Add")
withAnimation
addList()
)
.navigationTitle("Lists")
private func addList()
let newList = TaskList(context: viewContext)
newList.name = "New List"
newList.dateCreated = Date()
let newTask = TaskItem(context: viewContext)
newTask.name = "New List Task"
newList.addToItems(newTask)
try? viewContext.save()
在列表中显示项目的视图代码:
struct TaskItemsView: View
@Environment(\.managedObjectContext) var viewContext
var list: TaskList
var body: some View
List
ForEach(list.itemsArray, id: \.self) item in
Text(item.wrappedName)
.navigationTitle(list.wrappedName)
.navigationBarItems(trailing: Button("Add")
withAnimation
addTask()
)
private func addTask()
let newTask = TaskItem(context: viewContext)
newTask.name = "New Task in list \(list.wrappedName)"
list.addToItems(newTask)
try? viewContext.save()
【问题讨论】:
【参考方案1】:NSManagedObject
是一个ObservableObject
,所以要观察视图的变化,你需要用ObservedObject
包装它,比如
struct TaskItemsView: View
@Environment(\.managedObjectContext) var viewContext
@ObservedObject var list: TaskList // << here !!
【讨论】:
以上是关于通过@State 传递 NSManagedObject ...? SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章
如何为通过 SwiftUI 中的自定义结构传递的 @State 值设置动画
NSManagedObject 传递给 ViewController 是不是反映所有更新