SwiftUI Picker选择绑定未更新

时间:2019-12-10 23:59:29

标签: ios swift core-data swiftui

我试图让选择器列出所有类型的Course,然后在向托管对象上下文中添加新的Assignment时让用户选择适当的课程。当用户在选择器视图中点击一行时,选择器选择绑定(courseIndex)不会更新。我不确定如何解决此问题,也不知道是什么原因引起的。任何帮助表示赞赏!

这是受影响的代码:

struct NewAssignmentView: View {

@Environment(\.presentationMode) var presentationMode
@Environment(\.managedObjectContext) var context
@FetchRequest(entity: Course.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Course.name, ascending: true)]) var courses: FetchedResults<Course>

@State var name = ""
@State var hasDueDate = false
@State var dueDate = Date()
@State var courseIndex = 0


var body: some View {
    NavigationView {
        Form {
            TextField("Assignment Name", text: $name)
            Section {
                Picker(selection: $courseIndex, label:
                    HStack {
                        Text("Course: ")
                        Spacer()
                        Text(self.courses[self.courseIndex].name ?? "").foregroundColor(self.courses[self.courseIndex].color).bold()
                    })
                {
                    ForEach(self.courses, id: \.self) { course in
                        Text("\(course.name ?? "")").foregroundColor(course.color).tag(course)
                    }
                }
            }
            Section {
                Toggle(isOn: $hasDueDate.animation()) {
                    Text("Due Date")
                }
                if hasDueDate {
                    DatePicker(selection: $dueDate, displayedComponents: .date, label: { Text("Set Date:") })
                }
            }
        }
[...]

1 个答案:

答案 0 :(得分:0)

我无法使您的快照可编译,因此只能进行更改,在这里...我假设由于您的选择是索引,因此您必须使用范围ForEach,例如

ForEach(0 ..< self.courses.count) { i in
    Text("\(self.courses[i].name ?? "")").foregroundColor(self.courses[i].color).tag(i)
}

PS。不确定tag的用法,可能不需要。