在SwiftUI中显示可切换项数组列表的最佳方法
对于一个简单的UIKit,我正在努力寻找使用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
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()
}
}