SwiftUI 将 Int 值传递给 ViewModel
SwiftUI pass Int value to the ViewModel
我试图将 Int 传递给 ViewModel,但它不起作用。 Value还是0。Strings或者Data对象没有问题,但是Int、Double等数字值还是0值。我也试过这种方法:
@Published var tankCapacity: Int?
但还是一样。如何解决?使用字符串并转换为给定类型?
AddVehicleView:
import SwiftUI
struct AddVehicleView: View {
@ObservedObject var viewModel: AddVehicleViewModel
@State private var selected = 0
@State private var showingAlert = false
init(viewModel: AddVehicleViewModel) {
self.viewModel = viewModel
UITableView.appearance().backgroundColor = .clear
UITableView.appearance()
}
var body: some View {
VStack(alignment: .leading) {
Text("Add new vehicle")
.font(.system(size: 26, weight: .medium))
.padding(.top, -30)
.padding(.leading, 20)
VStack {
TextField("Brand/Model etc", text: $viewModel.name)
.padding(.top, 10)
.padding(.leading, 20)
.padding(.trailing, 20)
.font(.system(size: 20))
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("Capacity", value: $viewModel.tankCapacity, formatter: NumberFormatter()) // I am trying send int value from here
.padding(.top, 30)
.padding(.leading, 20)
.padding(.trailing, 20)
.font(.system(size: 20))
.textFieldStyle(RoundedBorderTextFieldStyle())
Form {
Section {
Picker("Fuel type", selection: $viewModel.fuelType) {
ForEach(0 ..< viewModel.fuels.count) {
Text(self.viewModel.fuels[[=10=]]).tag([=10=])
.padding(.leading, 5)
.padding(.trailing, 5)
}
}
}
}
.padding(.leading, 5)
.padding(.trailing, 5)
Button("Add") {
if self.viewModel.name.isEmpty {
self.showingAlert = true
}
else {
self.viewModel.saveVehicle()
self.viewModel.name = ""
}
}
.frame(width: 200, height: 50)
.background(Color.blue)
.font(.system(size: 20, design: .default))
.foregroundColor(Color.white)
.cornerRadius(10)
.padding(.top, -350)
.alert(isPresented: $showingAlert) {
Alert(title: Text("Warning!"), message: Text("Fill the fields"))
}
}
Spacer()
}
}
}
导入基金会
class AddVehicleViewModel: ObservableObject {
@Published var name = ""
@Published var tankCapacity = 0 // and here I am trying to get value.
@Published var fuelType = 0
@Published var fuels = ["Petrol", "Diesel"]
private let persistenceService: PersistenceServiceProtocol
init(persistenceService: PersistenceServiceProtocol) {
self.persistenceService = persistenceService
}
func saveVehicle() {
print("name: \(name)")
print("tankCapacity: \(tankCapacity)")
let vehicle = Vehicle(name: name,
tankCapacity: tankCapacity)
do {
try self.persistenceService.addVehicle(vehicle: vehicle)
}
catch {
print("ADDVEHICLEMODEL saveVehicle Error")
}
}
}
您需要在调用 saveVehicle
之前先提交 TextField(通过按回车键)。
如果您改为在视图模型中执行以下操作:
@Published var tankCapacityText = "" {
didSet {
tankCapacity = Int(tankCapacityText) ?? 0
}
}
@Published var tankCapacity = 0
在您看来:
TextField("Capacity", text: $vm.tankCapacityText)
那么用户就不需要回车了。
我试图将 Int 传递给 ViewModel,但它不起作用。 Value还是0。Strings或者Data对象没有问题,但是Int、Double等数字值还是0值。我也试过这种方法:
@Published var tankCapacity: Int?
但还是一样。如何解决?使用字符串并转换为给定类型?
AddVehicleView:
import SwiftUI
struct AddVehicleView: View {
@ObservedObject var viewModel: AddVehicleViewModel
@State private var selected = 0
@State private var showingAlert = false
init(viewModel: AddVehicleViewModel) {
self.viewModel = viewModel
UITableView.appearance().backgroundColor = .clear
UITableView.appearance()
}
var body: some View {
VStack(alignment: .leading) {
Text("Add new vehicle")
.font(.system(size: 26, weight: .medium))
.padding(.top, -30)
.padding(.leading, 20)
VStack {
TextField("Brand/Model etc", text: $viewModel.name)
.padding(.top, 10)
.padding(.leading, 20)
.padding(.trailing, 20)
.font(.system(size: 20))
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("Capacity", value: $viewModel.tankCapacity, formatter: NumberFormatter()) // I am trying send int value from here
.padding(.top, 30)
.padding(.leading, 20)
.padding(.trailing, 20)
.font(.system(size: 20))
.textFieldStyle(RoundedBorderTextFieldStyle())
Form {
Section {
Picker("Fuel type", selection: $viewModel.fuelType) {
ForEach(0 ..< viewModel.fuels.count) {
Text(self.viewModel.fuels[[=10=]]).tag([=10=])
.padding(.leading, 5)
.padding(.trailing, 5)
}
}
}
}
.padding(.leading, 5)
.padding(.trailing, 5)
Button("Add") {
if self.viewModel.name.isEmpty {
self.showingAlert = true
}
else {
self.viewModel.saveVehicle()
self.viewModel.name = ""
}
}
.frame(width: 200, height: 50)
.background(Color.blue)
.font(.system(size: 20, design: .default))
.foregroundColor(Color.white)
.cornerRadius(10)
.padding(.top, -350)
.alert(isPresented: $showingAlert) {
Alert(title: Text("Warning!"), message: Text("Fill the fields"))
}
}
Spacer()
}
}
}
导入基金会
class AddVehicleViewModel: ObservableObject {
@Published var name = ""
@Published var tankCapacity = 0 // and here I am trying to get value.
@Published var fuelType = 0
@Published var fuels = ["Petrol", "Diesel"]
private let persistenceService: PersistenceServiceProtocol
init(persistenceService: PersistenceServiceProtocol) {
self.persistenceService = persistenceService
}
func saveVehicle() {
print("name: \(name)")
print("tankCapacity: \(tankCapacity)")
let vehicle = Vehicle(name: name,
tankCapacity: tankCapacity)
do {
try self.persistenceService.addVehicle(vehicle: vehicle)
}
catch {
print("ADDVEHICLEMODEL saveVehicle Error")
}
}
}
您需要在调用 saveVehicle
之前先提交 TextField(通过按回车键)。
如果您改为在视图模型中执行以下操作:
@Published var tankCapacityText = "" {
didSet {
tankCapacity = Int(tankCapacityText) ?? 0
}
}
@Published var tankCapacity = 0
在您看来:
TextField("Capacity", text: $vm.tankCapacityText)
那么用户就不需要回车了。