swift - 将 Picker 与核心数据一起使用
问题描述
我在这里看到了许多关于类似问题的回复,但是下面代码中 $category 的选择器似乎不起作用。当我选择选择器时,我会看到 categoryNames 列表,但是当我选择一个时,它不会填充到 $category 中。
我有 2 个 CoreData 实体:费用
- 费用帐户:字符串
- 费用类别:字符串
- 费用成本:双倍
- 费用日期:日期
- 费用ID:UUID
- 费用是每月:布尔
- 费用名称:字符串类别
- 类别名称:字符串
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()
}
}
解决方案
推荐阅读
- django - 从获取 TypeError 的查询集中获取值:“方法”对象不可下标
- android - 在 Ubuntu 18.04 上使用 Android Studio 时遇到无法使用的显示问题
- spring - 未填充 HTML 表数据的 Spring Boot
- javascript - 在 React 中解压“这个”是不好的做法吗?
- java - 如何获取 JSONArray 的最深元素
- php - PHP日期函数产生不正确的结果
- string - 使用 Stream API 比较两个字符串并计算差异
- swift - 如何创建下拉菜单
- php - 从 Wordpress 搜索中排除多个自定义分类术语
- python - 谁能帮我我的代码有什么问题?