在核心数据中使用Picker

时间:2020-09-23 01:50:27

标签: swift swiftui

我在这里看到了很多有关类似问题的回复,但是下面代码中的$ category选择器似乎不起作用。选择选择器时,会看到categoryNames列表,但是选择一个时,不会将其填充到$ category中。

我有2个CoreData实体: 费用

  • expenseAccount:String
  • expenseCategory:String
  • expenseCost:Double
  • expenseDate:Date
  • expenseId:UUID
  • expenseIsMonthly:Bool
  • expenseName:字符串 类别
  • categoryName:String
import SwiftUI
import CoreData


struct ExpenseDetail: View {
    
    @FetchRequest(
        entity: Categories.entity(),
        sortDescriptors: [
            NSSortDescriptor(keyPath: \Categories.categoryName, ascending: true)
        ]
    )
    private var result: FetchedResults<Categories>
    
    var logToEdit: Expenses?
    @Environment(\.managedObjectContext) var context
    @State var name: String = ""
    @State var amount: String = ""
    @State var category: String = ""
    @State var date: Date = Date()
    @State var account: String = ""
    @State var isMonthly: Bool = false
    
    var currencyFormatter: NumberFormatter = {
        let f = NumberFormatter()
        f.numberStyle = .currency
        return f
    }()
    
    @Environment(\.presentationMode) var presentationMode
    
    
    var body: some View {
        NavigationView {
            Form{
                TextField("Expense Name", text: $name)
                Section{
                    HStack{
                        TextField("$\(amount)", text: $amount)
                            .keyboardType(.decimalPad)
                            .textFieldStyle(PlainTextFieldStyle())
                            .disableAutocorrection(true).multilineTextAlignment(.leading)
                        
                        
                        
                        
                    }
                    
                    DatePicker(selection: $date, displayedComponents: .date) {
                        Text("Date")
                    }.onAppear{self.hideKeyboard()}
                    
                    
                    Picker(selection: $category, label: Text("Category")) {
                        ForEach(result) { (log: Categories) in
                            Text(log.categoryName ?? "No Category").tag(log.categoryName)
                        }
                    }
                    
                    Picker(selection: $account, label: Text("Account")) {
                        ForEach(result) { (log: Categories) in
                            self.Print("\(log.categoryName ?? "")")
                            Button(action: {
                                // TODO: Implement Edit
                            }) {
                                Text(log.categoryName!.capitalized).tag(self.category)
                            }
                            
                        }
                    }
                    Toggle(isOn: $isMonthly) {
                        Text("Monthly Expense")
                    }.toggleStyle(CheckboxToggleStyle())
                }
                
                Section{
                    Button(action: {
                        onSaveTapped()
                    }) {
                        HStack {
                            Spacer()
                            Text("Save")
                            Spacer()
                        }
                    }
                    
                    
                }
                Section{
                    Button(action: {
                        self.presentationMode.wrappedValue.dismiss()
                    }) {
                        HStack {
                            Spacer()
                            Text("Cancel").foregroundColor(.red)
                            Spacer()
                        }
                        
                    }
                }
            }.navigationBarTitle("Add Expense")
        }
        
    }
    
    private func onSaveTapped() {
        
        let expenseLog: Expenses
        if let logToEdit = self.logToEdit {
            expenseLog = logToEdit
        } else {
            expenseLog = Expenses(context: self.context)
            expenseLog.expenseId = UUID()
        }
        
        expenseLog.expenseName = self.name
        expenseLog.expenseCategory = self.category
        print("\(expenseLog.expenseName ?? "") category Picker: \(self.category)")
        print("\(expenseLog.expenseName ?? "") ExpenseCategory: \(expenseLog.expenseCategory!)")
        expenseLog.expenseCost = Double(self.amount) ?? 0
        print("\(expenseLog.expenseName ?? "") Amount: \(self.amount)")
        print("\(expenseLog.expenseName ?? "")ExpenseCost: \(expenseLog.expenseCost)")
        expenseLog.expenseDate = self.date
        expenseLog.expenseAccount = self.account
        expenseLog.expenseIsMonthly = self.isMonthly
        
        do {
            try context.save()
        } catch let error as NSError {
            print(error.localizedDescription)
        }
        
        self.presentationMode.wrappedValue.dismiss()
    }
    
    
}

1 个答案:

答案 0 :(得分:0)

当Category.categoryName为String?时,选择值的类型为String。注意添加的?,这意味着它是可选的。

这是CoreData的默认类型,但是您可以在模型内部删除Optional值:
CoreData Optional

我会问自己在进行此更改之前,没有名称的类别是否有意义。如果是这样,您可能必须使用其他标识符进行选择。