【问题标题】:Saved Double Values showing as 0.00 instead of what was entered in text field保存的双精度值显示为 0.00,而不是在文本字段中输入的内容
【发布时间】: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)
    }
}
}

Preview of Error when trying to add dollar value

【问题讨论】:

  • 你能创建一个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


【解决方案1】:

您的代码在 macos 12.beta、xcode 13.beta、 目标 ios 15 和 macCatalyst 12。 这是我使用的测试代码,应该和你的代码一样:

import SwiftUI
import CoreData

@main
struct CoreDataTestApp: App {
    let persistenceController = PersistenceController.shared

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.managedObjectContext, persistenceController.container.viewContext)
        }
    }
}

struct ContentView: View {

    @State private var dollarValue: String = ""
    @State var dollarAsInt: Double = 0.0
    @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>
    
    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)")
            }
        }
    }

    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
        }.navigationViewStyle(.stack)
    }
    
    private var formatter: NumberFormatter = {
        let f = NumberFormatter()
        // allow no currency symbol, extra digits, etc
        f.isLenient = true
        f.numberStyle = .currency
        return f
    }()

    private let itemFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateStyle = .short
        formatter.timeStyle = .medium
        return formatter
    }()
    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多