0

我正在做一个核心数据实践项目。问题是当用户改变主意编辑旧订单时,颜色属性不显示当前保存的颜色,当用户从选择中更改新颜色时,选择器不会隐藏,新颜色也不会更新颜色属性。请帮帮我,非常感谢

编辑订单视图

选择新颜色

选择器不会隐藏

返回 EditOrderView,没有更新颜色选择

核心数据列表

内容视图

import SwiftUI

struct ContentView: View {
    @Environment(\.managedObjectContext) var moc
    @FetchRequest(sortDescriptors: []) var orderDetails: FetchedResults<OrderDetails>
    @State private var isShowingOrder = false
    
    var body: some View {
        NavigationView {
            List{
                ForEach(orderDetails) { detail in
                    NavigationLink{
                        DetailView(orderDetail: detail)
                    } label: {
                        VStack(alignment: .leading){
                            HStack{
                                Text(detail.name ?? "Unknown")
                            }
                            Text(detail.color ?? "Unknown")
                        }
                    }
                }
                .onDelete(perform: deleteOrders)
            }
            .navigationTitle("Order List")
            .navigationBarTitleDisplayMode(.inline)
            .toolbar {
                ToolbarItem(placement: .navigationBarLeading) {
                    EditButton()
                }
                
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button{
                        isShowingOrder.toggle()
                    } label: {
                        Label("", systemImage: "plus")
                    }
                }
            }
            .sheet(isPresented: $isShowingOrder) {
                AddOrderView()
            }
        }
    }
    
    func deleteOrders(at offsets: IndexSet) {
        for offset in offsets {
            let order = orderDetails[offset]
            moc.delete(order)
        }
        
        try? moc.save()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

添加订单视图

import SwiftUI

struct AddOrderView: View {
    @Environment(\.managedObjectContext) var moc
    @Environment(\.dismiss) var dismiss
    
    @State private var name = ""
    @State private var amount = 0
    @State private var color = ""
    @State private var comments = ""
    
    let colors = ["red", "blue", "green", "white", "black", "orange"]
    
    var body: some View {
        NavigationView{
            Form{
                Section {
                    TextField("Name of Product", text: $name)
                }
                
                Section {
                    Stepper("Order Amount: \(amount)", value: $amount, in: 0...100)
                }
                
                Section {
                    Picker("Color", selection: $color) {
                        ForEach(colors, id: \.self){
                            Text($0)
                        }
                    }
                }
                
                Section {
                    TextField("Comments", text: $comments)
                } header: {
                    Text("Please write your special request here:")
                }
            }
            .navigationTitle("Add new order")
            .navigationBarTitleDisplayMode(.inline)
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("Save") {
                       let newOrder = OrderDetails(context: moc)
                        newOrder.name = name
                        newOrder.amount = Int16(amount)
                        newOrder.color = color
                        newOrder.comments = comments
                        try? moc.save()
                        dismiss()
                    }
                }
            }
        }
    }
}

struct AddOrderView_Previews: PreviewProvider {
    static var previews: some View {
        AddOrderView()
    }
}

详细视图

import SwiftUI

struct DetailView: View {
    let orderDetail: OrderDetails
    
    @Environment(\.managedObjectContext) var moc
    @Environment(\.dismiss) var dismiss
    
    @State private var isEditingAgain = false
    
    var body: some View {
        ScrollView{
            VStack{
                Text("Order Amount: \(orderDetail.amount)")
                Text("Color: \(orderDetail.color ?? "Unknown")")
                Text("Comments: \(orderDetail.comments ?? "Unknown")")
            }
        }
        .navigationTitle(orderDetail.name ?? "Unknown")
        .navigationBarTitleDisplayMode(.inline)
        .toolbar {
            
            ToolbarItem(placement: .navigationBarTrailing) {
                Button {
                    isEditingAgain = true
                } label: {
                    Label("", systemImage: "square.and.pencil")
                }

            }
        }
        .sheet(isPresented: $isEditingAgain) {
            EditOrderView(currentDetails: orderDetail)
        }

    }
}

编辑订单视图

import SwiftUI

struct EditOrderView: View {
    @Environment(\.managedObjectContext) var moc
    @Environment(\.dismiss) var dismiss
    
    @ObservedObject var currentDetails: OrderDetails
    
    let editColors = ["red", "blue", "green", "white", "black", "orange"]
        
    var body: some View {
        NavigationView{
            Form{
                Section {
                    TextField("Name of Product", text: $currentDetails.name ?? "")
                }
                
                Section {
                    Stepper("Order Amount: \(currentDetails.amount)", value: $currentDetails.amount, in: 0...100)
                }
                
                Section {
                    Picker("Color", selection: $currentDetails.color) {
                        ForEach(editColors, id: \.self){
                            Text($0)
                        }
                    }
                }
                
                Section {
                    TextField("Comments", text: $currentDetails.comments ?? "")
                } header: {
                    Text("Please write your special request here:")
                }
            }
            .navigationTitle("Edit Order")
            .navigationBarTitleDisplayMode(.inline)
            .toolbar{
                ToolbarItem(placement: .navigationBarTrailing){
                    Button("Save") {
                        try? self.moc.save()
                        dismiss()
                    }
                }
            }
        }
    }
}
4

0 回答 0