【发布时间】:2021-10-22 09:26:33
【问题描述】:
我是 Swift 语言的初学者,我正在尝试处理一个简单的费用跟踪项目,但在保存项目时无法让在文本字段中输入的 Double 值显示在下面的列表中。非常感谢任何帮助/帮助和解释!
这是我使用的代码减去设置为 .currency 的格式化程序
import SwiftUI
import CoreData
struct ContentView: View {
// MARK: - PROPERTIES
@State private var dollarValue: String = ""
@State var dollarAsInt: Double = Double()
@State private var plug: String = ""
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)],
animation: .default)
private var items: FetchedResults<Item>
// MARK: - FUNCTION
private func addItem() {
withAnimation {
let newItem = Item(context: viewContext)
newItem.timestamp = Date()
newItem.dollarValue = dollarValue
newItem.dollarAsInt = dollarAsInt
newItem.id = UUID()
do {
try viewContext.save()
} catch {
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
}
}
private func deleteItems(offsets: IndexSet) {
withAnimation {
offsets.map { items[$0] }.forEach(viewContext.delete)
do {
try viewContext.save()
} catch {
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
}
}
// MARK: - BODY
var body: some View {
NavigationView {
VStack {
VStack(spacing: 16){
TextField("Label", text: $dollarValue)
.padding()
.background(Color(UIColor.systemGray6))
.cornerRadius(10)
TextField("Dollar Amount", value: $dollarAsInt, formatter: formatter)
.padding()
.background(Color(UIColor.systemGray6))
.cornerRadius(10)
.keyboardType(.decimalPad)
Button(action: {addItem()}, label: {
Spacer()
Text("Save")
Spacer()
})
.padding()
.foregroundColor(.white)
.background(Color.blue)
.cornerRadius(10)
} //: VSTACK
.padding()
List {
ForEach(items) { item in
HStack {
VStack(alignment: .leading) {
Text(item.dollarValue ?? "")
.fontWeight(.semibold)
Text("\(item.timestamp!, formatter: itemFormatter)")
.foregroundColor(.gray)
.font(.footnote)
}
Spacer()
VStack{
Text("\(item.dollarAsInt)")
//Text("\(item.dollarAsInt)")
.fontWeight(.semibold)
Text("Category")
.foregroundColor(.gray)
.font(.footnote)
}
}
}
.onDelete(perform: deleteItems)
}//:List
} //: VSTACK
.navigationBarTitle("Transactions", displayMode: .large)
.toolbar {
#if os(iOS)
ToolbarItem(placement: .navigationBarTrailing) {
EditButton()
}
#endif
ToolbarItem(placement: .navigationBarLeading) {
Button(action: addItem) {
Label("Add Item", systemImage: "plus")
}
}
} //: TOOLBAR
} //: NAVIGATION
}
// MARK: - PREVIEW
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
}
}
}
【问题讨论】:
-
你能创建一个minimal, reproducible example吗?应该是我可以复制、粘贴和运行的东西。例如,您可以将代码简化为
TextField,这是问题仍然存在的最简单示例。当它依赖于 Core Data 和我没有的其他类型时,我无法运行此示例。 -
var dollarAsInt: Double是可疑的。您将核心数据项“dollarAsInt”声明为 Int 还是 Double? -
测试了您的代码,如果我在核心数据中将“dollarAsInt”声明为 Double。
-
所以仔细检查,我确实在核心数据中将 DollarAsInt 作为 Double .. 但由于某种原因,当我运行它并在两个文本字段中测试值时,只有标签被保存并传递,而美元值只是遇到 0.00000
-
我会发布一个最小的错误示例,但老实说,我不知道它是否在我的文本字段中,或者当我获取它并使用 text("(Double)") 尝试显示保存的值或者可能在我的格式化程序中......
标签: swift string core-data swiftui double