【问题标题】:SwiftUI Show Persistent Value of Picker Item as the Highlighted Choice When Picker DisplayedSwiftUI 在 Picker 显示时将 Picker Item 的持久值显示为突出显示的选项
【发布时间】:2022-01-22 13:18:25
【问题描述】:

我在一个 SwiftUI 应用程序中有几个 Picker,其中 Picker 项目存储在 Core Data 中。 每个 Picker 项只有一个标题:String 和一个注释:String。

App 有 List 和 DetailView 格式,在 DetailView 中带有 Picker。我用 一个 @State 变量来指示是否正在编辑。如果 isEditing 为假, 文本字段显示存储的选择。如果 isEditing 为真,则显示选取器。这 一切正常,除了将 isEditing 设置为 true 会显示带有项目 0 的选择器 从数据支持。真正的价值仍然在 Core Data 中,但它看向用户 选择已被覆盖。

我创建了一个自定义绑定来设置用户选择:

var spinner1Binding: Binding<Int> {
    Binding(
        get: { self.selectionIndex1 },
        set: {
            self.selectionIndex1 = $0
            self.picker1Text = picker1ListVM.picker1Items[self.selectionIndex1].picker1Title
            patientDetailVM.pubSpinner1 = picker1ListVM.picker1Items[self.selectionIndex1].picker1Title
        })}

视图模型 picker1Items 是 Picker1Model 的数组

struct Picker1Model: Identifiable {
    let picker1Item: Picker1Item
    var id: NSManagedObjectID {
        return picker1Item.objectID
    }
    var picker1Title: String {
        return picker1Item.title ?? "No Picker 1 Title"
    }
    var picker1Comment: String {
        return picker1Item.comment ?? "No Picker 1 Comment"
    }
}//picker 1 model

这是 DetailView 中的代码。我只添加了第二个文本来说明 实际价值仍然是公布的价值:

VStack {
    Text(appSpinner1Title + ":")
        .modifier(LabelTextSetup())
        //Remove this when problem solved
    Text(isEditing ? "Current: \(patientDetailVM.pubSpinner1)" : "")
        .modifier(LabelTextSetup())
}
Spacer()
if isEditing {
    Picker(selection: spinner1Binding, label : Text("Picker One Choice")) {
        ForEach(picker1ListVM.picker1Items.indices, id: \.self) { index in
            Text(picker1ListVM.picker1Items[index].picker1Title).tag(index)
        }//for
    }//picker
} else {
    Text(patientDetailVM.pubSpinner1)
        .modifier(LabelTextSetup())
}

不编辑时是这样的:

编辑时看起来像这样。显然,我希望选择器在这种情况下显示“Urgently Ortho”。

看起来这应该很容易,但我没有成功。

任何指导将不胜感激。 Xcode 13.2.1 iOS 15

【问题讨论】:

  • 这能回答你的问题吗? Choosing CoreData Entities from form picker
  • 并非如此。创建选择器并将值保存到 Core Data 的代码按预期工作。唯一的问题是我无法将初始选择设置为 Core Data 中确实存在的值。请参阅我的答案以获取可行但不是特别优雅的解决方案。
  • 您的代码无法按照您提供的内容进行排序,它不完整且无法连接,但您不需要自定义任何东西来将选择器连接到核心数据实体以保持其始终正确。只需用 ObservedObject 包装核心数据对象并直接使用该值即可。您可能需要将选项转换为标签中的选项。请参阅示例链接。
  • 感谢您的帮助。

标签: ios xcode swiftui


【解决方案1】:

问题是我无法将 Picker 项目的选择设置为显示为 创建 Picker 时的当前项目(来自 Core Data)。我以为我应该能够 在 Picker 的自定义绑定中执行此操作,但我无法得到任何东西 正常工作。

我的解决方案是创建一个函数来收集存储在 核心数据并在创建 Picker 时执行该功能。它有效,但是 似乎应该有更好的方法。

func setSelection1() {
    for x in 0..<picker1ListVM.picker1Items.count {
        if picker1ListVM.picker1Items[x].picker1Title == patientDetailVM.pubSpinner1 {
            selectionIndex1 = x
        }//if
    }//for in
}//set selection

然后也在显示 Picker 的视图中,调用 .onAppear 中的函数:

Picker(selection: spinner1Binding, label : Text("Picker One Choice")) {
    ForEach(picker1ListVM.picker1Items.indices, id: \.self) { index in
        Text(picker1ListVM.picker1Items[index].picker1Title).tag(index)
    }//for
}//picker
.onAppear {
    setSelection1()
}

希望这对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2021-04-19
    • 1970-01-01
    • 2011-04-23
    相关资源
    最近更新 更多