Ios 如何进行绑定或状态的值转换
我试图理解如何将价值从模型转换为视图。例如,我有一个模型:Ios 如何进行绑定或状态的值转换,ios,swift,swiftui,Ios,Swift,Swiftui,我试图理解如何将价值从模型转换为视图。例如,我有一个模型: struct BloodPressure { var systolic: Int = 0 var diastolic: Int = 0 } 我有一个观点: struct MeasurementsTabView: View { @State private var bloodPressure = BloodPressure() var body: some View { VStack
struct BloodPressure {
var systolic: Int = 0
var diastolic: Int = 0
}
我有一个观点:
struct MeasurementsTabView: View {
@State private var bloodPressure = BloodPressure()
var body: some View {
VStack {
TextField("Systolic", text: $bloodPressure.systolic)
TextField("Diastolic", text: $bloodPressure.diastolic)
}
}
}
有一个错误,因为text
参数应该是字符串,但bloodPressure.systolic
是Int
我找到了一个解决方案,但我认为这并不优雅:
var body: some View {
let systolicBinding = Binding <String> (
get: { String(self.bloodPressure.systolic) },
set: {
if let int = Int($0) {
self.bloodPressure.systolic = int
}
})
let diastolicBinding = Binding <String> (
get: { String(self.bloodPressure.diastolic) },
set: {
if let int = Int($0) {
self.bloodPressure.diastolic = int
}
})
return VStack {
TextField("Systolic", text: systolicBinding)
TextField("Diastolic", text: diastolicBinding)
}
}
var主体:一些视图{
让systolicBinding=绑定(
获取:{String(self.bloodPressure.systolic)},
设置:{
如果让int=int($0){
self.bloodPressure.systolic=int
}
})
让舒张结合=结合(
get:{String(self.bloodPressure.diseastium)},
设置:{
如果让int=int($0){
自我血压舒张压=int
}
})
返回VStack{
TextField(“Systolic”,文本:systolicBinding)
文本字段(“舒张”,文本:舒张绑定)
}
}
如何解决类似问题?在这种情况下,我建议引入ViewModel层,这样血压仍然是纯模型 下面是概念的简化演示(例如,文本字段的格式设置/验证超出范围等)
谢谢您的回答,但是它看起来有点复杂,因为简单的绑定
发布的在您的情况下是无用的
import SwiftUI
import Combine
struct BloodPressure {
var systolic: Int = 0
var diastolic: Int = 0
}
class BloodPressureViewModel: ObservableObject {
var model: BloodPressure
init(_ model: BloodPressure) {
self.systolic = String(model.systolic)
self.diastolic = String(model.diastolic)
self.model = model
}
@Published var systolic: String = "" {
didSet {
self.model.systolic = Int(self.systolic) ?? 0
}
}
@Published var diastolic: String = "" {
didSet {
self.model.diastolic = Int(self.diastolic) ?? 0
}
}
}
struct MeasurementsTabView: View {
@ObservedObject var viewModel: BloodPressureViewModel
init(bloodPressure: BloodPressure) {
viewModel = BloodPressureViewModel(bloodPressure)
}
var body: some View {
VStack {
TextField("Systolic", text: $viewModel.systolic)
TextField("Diastolic", text: $viewModel.diastolic)
}
}
}