通过@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 值设置动画

将@State 变量传递给 ContentView

NSManagedObject 传递给 ViewController 是不是反映所有更新

reactReact学习:状态(State) 和 属性(Props)

05react 之 组件state

React中Props 和 State用法