为什么我的视图没有更新我发布的变量?

时间:2021-02-18 01:42:40

标签: ios swift iphone swiftui ios14

我正在制作一个个人项目来学习 SwiftUI。一切都很顺利,我注意到我的应用程序上有一个错误。

我有一个简单的视图,它在我的 ViewModel 上保存了描述、值和一些标签。我遇到了 $viewModel.value 的问题。该变量没有被视图中的值填充。

我假设我的 ViewModel 中的 @Published var value: Double? 应该在用户输入某个值时更新。事实是,它不会在任何 iPhone 11 及更高版本上更新,但它可以在 iPhone 8 上完美运行。

public struct AddBillView: View {
    
    @ObservedObject private var viewModel: AddBillViewModel
    
    @Environment(\.presentationMode) var presentationMode

    
    public let onExpenseCreated: ((_ expense: Expense)->Void)
    
    public var body: some View {
        Text("Add Expense")
        VStack {
            TextField("Descrição", text: $viewModel.name)
            HStack {
                Text("Valor \(NumberFormatter.currency.currencySymbol)")
                CurrencyTextField("Value", value: $viewModel.value)
                            .multilineTextAlignment(TextAlignment.leading)
            }
            
            HStack {
                Text("Tags")
                TextField("car pets home",
                          text: $viewModel.tags)
            }
                
            Picker("Type", selection: $viewModel.type) {
                Text("Paid").tag("Paid")
                Text("Unpaid").tag("Unpaid")
                Text("Credit").tag("Credit")
            }
        }.navigationTitle("+ Expense")
        
        Button("Adicionar") {
            if !viewModel.hasExpense() {
                return
            }
            onExpenseCreated(viewModel.expense())
            self.presentationMode.wrappedValue.dismiss()
        }
    }
    
    public init(viewModel outViewModel: AddBillViewModel,
                onExpenseCreated: @escaping ((_ expense: Expense)->Void)) {
        self.viewModel = outViewModel
        self.onExpenseCreated = onExpenseCreated
    }
}

我有一个视图模型:

public class AddBillViewModel: ObservableObject {
    @Published var name: String = ""
    @Published var type: String = "Paid"
    @Published var tags: String = ""
    @Published var value: Double?
    
    
    init(expense: Expense?=nil) {
        self.name = expense?.name ?? ""
        self.type = expense?.type.rawValue ?? "Paid"
        self.tags = expense?.tags?.map { String($0.name) }.joined(separator: " ") ?? ""
        self.value = expense?.value
    }
    
    func hasExpense() -> Bool {
        if self.name.isEmpty ||
            self.value == nil ||
            self.value?.isZero == true {
            return false
        }
        return true
    }
    
    func expense() -> Expense {
        let tags = self.tags.split(separator: " ").map { Tag(name: String($0)) }
        return Expense(name: self.name, value: self.value ?? 0.0 ,
                       type: ExpenseType(rawValue: self.type)!,
                       id: UUID().uuidString,
                       tags: tags)
    }
}

然后我使用我的视图:


                AddBillView(viewModel: AddBillViewModel()) { expense in
                    viewModel.add(expense: expense)
                    viewModel.state = .idle
                }

我已经在谷歌上搜索并花了几个小时寻找答案,但没有运气。有人有什么想法吗?

已编辑

这是 CurrencyTextField 的代码。我正在使用这个组件: https://github.com/youjinp/SwiftUIKit/blob/master/Sources/SwiftUIKit/views/CurrencyTextField.swift

但是该组件在 iPhone 8 模拟器上运行良好,并且在我的视图中带有 @State 属性。它不仅适用于我的 ViewModel

0 个答案:

没有答案