【发布时间】:2020-02-15 19:17:48
【问题描述】:
我有以下模型对象,我用它来填充List,每行都有一个Toggle,它绑定到measurement.isSelected
final class Model: ObservableObject {
struct Measurement: Identifiable {
var id = UUID()
let name: String
var isSelected: Binding<Bool>
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]
@Published var hasSelection: Bool = false // How to set this?
init(measurements: [Measurement]) {
self.measurements = measurements
}
}
只要任何measurement.isSelected 是true,我希望hasSelection 属性为真。我猜想Model 需要观察measurements 的变化,然后更新其hasSelection 属性……但我不知道从哪里开始!
这个想法是 hasSelection 将绑定到 Button 以启用或禁用它。
Model的用法如下……
struct MeasurementsView: View {
@ObservedObject var model: Model
var body: some View {
NavigationView {
List(model.measurements) { measurement in
MeasurementView(measurement: measurement)
}
.navigationBarTitle("Select Measurements")
.navigationBarItems(trailing: NavigationLink(destination: NextView(), isActive: $model.hasSelection, label: {
Text("Next")
}))
}
}
}
struct MeasurementView: View {
let measurement: Model.Measurement
var body: some View {
HStack {
Text(measurement.name)
.font(.subheadline)
Spacer()
Toggle(measurement.name, isOn: measurement.isSelected)
.labelsHidden()
}
}
}
有关信息,这是我正在尝试实现的屏幕截图。可选择项目的列表,带有一个导航链接,当一个或多个被选中时启用,当没有项目被选中时禁用。
【问题讨论】:
-
您能否举例说明您是如何使用您的模型的?
-
@AshleyMills 让我们说按钮将 hasSelection 设置为 true。必须更改哪个 isSelected 值?这是 hasSelection 和 isSelected 之间的 1:N 链接。反之很简单,hasSelection 可以按需计算
-
@user3441734
hasSelection理想情况下应该是只获取属性,如果measurement.isSelected的any 为真,则为真