Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何进行绑定或状态的值转换_Ios_Swift_Swiftui - Fatal编程技术网

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)
        }
    }
}