将核心数据对象提取到 SwiftUI 选择器中
Posted
技术标签:
【中文标题】将核心数据对象提取到 SwiftUI 选择器中【英文标题】:Fetch core data object into a SwiftUI picker 【发布时间】:2020-12-03 15:52:31 【问题描述】:目标:将 Fetch 核心数据对象提取到 SwiftUI 选择器中
问题:还没有弄清楚如何将数据传递到 Picker 中
import SwiftUI
struct DetailView: View
@ObservedObject var order: Order
@State var showOrderEdit = false
var body: some View
Form
Text(order.flavor)
Text(order.tableNumber)
.navigationTitle(order.pizzaType)
.toolbar
ToolbarItem(placement: .primaryAction)
//edit button
Button(action:
showOrderEdit = true
, label:
Text("Edit")
)
.sheet(isPresented: $showOrderEdit)
DetailEdit(order: order)
import SwiftUI
struct DetailEdit: View
@State var tableNumber = ""
@ObservedObject var order: Order
@Environment(\.managedObjectContext) private var viewContext
@Environment (\.presentationMode) var presentationMode
@State var selectedFlavor = Flavor.chocolate
enum Flavor: String, CaseIterable, Identifiable
case chocolate
case vanilla
case strawberry
var id: String self.rawValue
var body: some View
NavigationView
Form
//1- this work fine
TextField("table number", text: $tableNumber)
//2- this doesnt get updated
Picker("Flavor", selection: $selectedFlavor)
Text("Chocolate").tag(Flavor.chocolate)
Text("Vanilla").tag(Flavor.vanilla)
Text("Strawberry").tag(Flavor.strawberry)
Text("Selected flavor: \(selectedFlavor.rawValue)")
//fetch data from core data -> item edit
.onAppear
//1- this work fine
self.tableNumber = self.order.tableNumber
//2- this doesnt get updated
self.selectedFlavor.rawValue = self.order.flavor
.navigationTitle("Edit Order")
【问题讨论】:
【参考方案1】:试试这个:
.onChange(of: selectedFlavor)
self.order.flavor = $0.rawValue
.onAppear
self.tableNumber = self.order.tableNumber
self.selectedFlavor = Flavor(rawValue: self.order.flavor)
【讨论】:
Detail->编辑作品(必须强制展开),选择器更新! :) 但是...当在选择器上选择另一个选项时,它保持相同的值 ex: DetailView(vanilla selected) -> EditView(vanilla selected) -> Picker (chocolate selected) -> EditView (显示 vanilla, 即使我们改成 Chocolate ) 可能是因为 swiftUI .onAppear 在 Picker > EditView 上再次获取核心数据? 在更改选择器值时,您需要将其设置回核心数据对象(当然假设您稍后保存整个对象)。查看更新。 谢谢!现在测试了,但是选择器仍然没有更新。它对你有用吗?以上是关于将核心数据对象提取到 SwiftUI 选择器中的主要内容,如果未能解决你的问题,请参考以下文章