我在SwiftUI中有一个ScooterReservationView类:
...
@State var extensionIDs: [Int] = []
var body: some View {
...
List(scooterExtensionVM.extensions, id: \.self) { scooterExtension in
ScooterExtensionRow(_extension: scooterExtension, extensionIDs: self.$extensionIDs)
}
...
scooterExtensionVM.extensions数组从API请求获取其值,这些扩展基于后端API是完全动态的。然后我有ScooterExtensionRow结构:
struct ScooterExtensionRow: View {
@EnvironmentObject var appState: AppState
@Binding var extensionIDs: [Int]
var scooterExtension: ScooterExtension
@State var isOn: Bool = true
init(_extension: ScooterExtension, extensionIDs: Binding<[Int]>) {
self.scooterExtension = _extension
self._extensionIDs = extensionIDs
}
var body: some View {
HStack {
Toggle(isOn: self.$isOn) {
Text(scooterExtension.name)
}
.padding()
}
}
}
我的目标是在任何ScooterExtensionRow视图内的Toggle更改时,更新extensionIDs数组。如果打开了任何Toggle,则需要向该数组添加ScooterExtension的扩展ID,如果关闭,则需要从数组中删除该ID。稍后需要我提出API请求。 (我需要收集所有已启用/已切换扩展名的ID)
问题是:我无法在文档中看到Toggle的任何回调操作,在该操作中我可以在数组中附加值/从数组中删除值,但是在这种情况下,回调并不是最好的方法SwiftUI世界。
谁能帮助实现这一目标的最佳方法是什么?
假设ScooterExtension
具有属性id
,可以按照以下步骤进行:
Toggle(isOn: Binding<Bool>(get:{ self.isOn },
set: {
self.isOn = $0
if $0 {
self.extensionIDs.append(self.scooterExtension.id)
} else {
self.extensionIDs = self.extensionIDs.filter { $0 != self.scooterExtension.id }
}
})) {
Text(scooterExtension.name)
}
啊,我明白你在评论中说的话。关于ID的新容器类型如何。有点像
class ExtensionID: Identifiable, ObservableObject {
let id: Int
var isOn: Bool = true
init(id: Int) {
self.id = id
}
}
然后,您也可以基于此,将Toggle绑定到isOn
属性,并有条件地显示ScooterExtensionRow(或基于给定id而不是从数组中实际丢失的其他任何更改)。
这有意义吗?