在SwiftUI中切换更改后更新数组

问题描述 投票:1回答:2

我在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世界。

谁能帮助实现这一目标的最佳方法是什么?

ios swift xcode swiftui
2个回答
1
投票

假设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而不是从数组中实际丢失的其他任何更改)。

这有意义吗?

© www.soinside.com 2019 - 2024. All rights reserved.