将核心数据对象提取到 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 选择器中的主要内容,如果未能解决你的问题,请参考以下文章

如何增加 SwiftUI 选择器中显示的最大行数?

Kettle实战之(2)过滤记录

如何知道用户在 SwiftUI 中的日期选择器中触摸了哪一天

选择器中的 SwiftUI 和枚举

从 SwiftUI 颜色选择器中获取价值

SwiftUI Picker 填充问题 - 选择器中的 ForEach 循环不填充