【问题标题】:Passing an NSManagedObject through @State...? SwiftUI通过@State 传递 NSManagedObject ...? 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()
}

}

【问题讨论】:

    标签: swift core-data swiftui


    【解决方案1】:

    NSManagedObject 是一个ObservableObject,所以要观察视图的变化,你需要用ObservedObject 包装它,比如

    struct TaskItemsView: View {
    @Environment(\.managedObjectContext) var viewContext
    @ObservedObject var list: TaskList                    // << here !!
    

    【讨论】:

      猜你喜欢
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 2020-01-31
      • 2022-01-06
      • 2022-11-06
      • 1970-01-01
      相关资源
      最近更新 更多