在SwiftUI中切换后更新数组

3

我有一个在SwiftUI中的ScooterReservationView类:

...
@State var extensionIDs: [Int] = []

var body: some View {
    ...
    List(scooterExtensionVM.extensions, id: \.self) { scooterExtension in
            ScooterExtensionRow(_extension: scooterExtension, extensionIDs: self.$extensionIDs)
    }
...

电动滑板车扩展VM的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世界中实现它的最佳方式。

有谁能帮忙找出实现这一目标的最佳方法吗?


“extensionIDs”是不是可以合并到“AppState”中,以便在那里存储(和发布)更新? - Ben
我可以将extensionIDs放入AppState中,但我认为这并不能解决我的原始问题,因为在切换开关后,我无法向该数组添加/删除元素。 - RobbeR
2个回答

3
假设 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)
}

0
啊,我明白你在评论中所说的。那么为这些 ID 使用一种新的容器类型如何?比如说:
class ExtensionID: Identifiable, ObservableObject {
    let id: Int
    var isOn: Bool = true

    init(id: Int) {
        self.id = id
    }
}

然后,您可以将Toggle绑定到isOn属性,并根据此条件有条件地显示ScooterExtensionRow(或者根据给定id关闭而不是实际从数组中缺失的其他更改)。

这有意义吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接