在SwiftUI中显示可切换项数组列表的最佳方法

在SwiftUI中显示可切换项数组列表的最佳方法,swiftui,swiftui-list,Swiftui,Swiftui List,对于一个简单的UIKit,我正在努力寻找使用SwiftUI的最佳解决方案。如有任何帮助/指导,我将不胜感激 我有一个对象数组,每个对象都可以选择。我第一次尝试这样做是: final class MeasurementSelections: ObservableObject { struct Measurement: Identifiable { let id = UUID() let name: String var isSelected

对于一个简单的UIKit,我正在努力寻找使用SwiftUI的最佳解决方案。如有任何帮助/指导,我将不胜感激

我有一个对象数组,每个对象都可以选择。我第一次尝试这样做是:

final class MeasurementSelections: ObservableObject {

    struct Measurement: Identifiable {
        let id = UUID()
        let name: String
        var isSelected: Bool = false

        init(name: String) {
            self.name = name
        }
    }

    @Published var measurements: [Measurement]

    init(measurements: [Measurement]) {
        self.measurements = measurements
    }
}

struct Readings: View {

    @ObservedObject var model: MeasurementSelections

    var body: some View {
        List(0..<model.measurements.count) { index in
            Text(self.model.measurements[index].name)
                .font(.subheadline)
            Spacer()
            Toggle(self.model.measurements[index].name, isOn: self.$model.measurements[index].isSelected)
                .labelsHidden()
        }
    }
}
这在视图分离方面更好,但是现在
MeasurementSelections
类变得更加复杂,需要合并

是否有一种解决方案可以保持视图分离,但使用更简单的模型

此外,我最终希望
MeasurementSelections
公开一个可绑定的(?)Bool属性,该属性在选择其任何度量值时设置,这可能会通知您的答案

范围的使用和复制 self.model.measures[索引]似乎不正确

没有复制,您直接操作模型中的数据,没有任何“复制”

导入快捷界面
结构数据:可识别{
设id=UUID()
变量名称:String
变量开/关:布尔
}
类模型:ObservieObject{
@公布的风险值数据=[数据(名称:“阿尔法”,开/关:假)、数据(名称:“贝塔”,开/关:假)、数据(名称:“伽马”,开/关:假)]
}
结构ContentView:View{
@ObservedObject var模型=模型()
var body:一些观点{
列表(0..

这与我的第一个示例没有什么不同。是的,没有区别,请使用它!没有复制,这是最直接的方法。最好的是,它是完全声明式(SwiftUI)方式。
final class MeasurementSelections: ObservableObject {

    struct Measurement: Identifiable {
        let id = UUID()
        let name: String
        var isSelected: Binding<Bool>

        private var selected: Bool = false

        init(name: String) {
            self.name = name

            let selected = CurrentValueSubject<Bool, Never>(false)
            self.isSelected = Binding<Bool>(get: { selected.value }, set: { selected.value = $0 })
        }
    }

    @Published var measurements: [Measurement]

    init(measurements: [Measurement]) {
        self.measurements = measurements
    }
}

struct Readings: View {

    @ObservedObject var model: MeasurementSelections

    var body: some View {
        VStack {
            MeasurementView(measurement: measurement)
        }
    }
}

struct MeasurementView: View {
    let measurement: MeasurementSelections.Measurement
    var body: some View {
        HStack {
            Text(measurement.name)
                .font(.subheadline)
            Spacer()
            Toggle(measurement.name, isOn: measurement.isSelected)
                .labelsHidden()
        }
    }
}
import SwiftUI

struct Data: Identifiable {
    let id = UUID()
    var name: String
    var on_off: Bool
}

class Model: ObservableObject {
    @Published var data = [Data(name: "alfa", on_off: false), Data(name: "beta", on_off: false), Data(name: "gama", on_off: false)]
}



struct ContentView: View {
    @ObservedObject var model = Model()
    var body: some View {
        List(0 ..< model.data.count) { idx in
            HStack {
                Text(verbatim: self.model.data[idx].name)
                Toggle(isOn: self.$model.data[idx].on_off) {
                    EmptyView()
                }
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}