【发布时间】: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()
}
}
【问题讨论】: