【问题标题】:SwiftUI Picker selection binding not updatingSwiftUI Picker 选择绑定未更新
【发布时间】:2020-04-04 05:17:45
【问题描述】:

我正在尝试创建一个名为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:") })
                }
            }
        }
[...]

【问题讨论】:

    标签: ios swift core-data swiftui


    【解决方案1】:

    当使用可选绑定值时,为标记值显式提供可选包装很重要,因为 Swift 不会自动为您解包,并且无法将非可选值等同于可选值。

    @Binding var optional: String?
    
    Picker("Field", selection: $optional) {
        // None option.
        Text("None").tag(String?.none)
        // Other fields.
        ForEach(options) { option in
            Text(option).tag(String?.some(option))
        }
    }
    

    【讨论】:

      【解决方案2】:

      我不能让你的快照可编译,所以只是改变了,在这里...我假设你的选择是索引,你必须使用 ranged ForEach 代替,比如

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

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

      【讨论】:

      • 解决了!非常感谢!
      猜你喜欢
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      相关资源
      最近更新 更多