Ios 在SwiftUI中切换更改后更新数组
我在SwiftUI中有一个ScooterReservationView类:Ios 在SwiftUI中切换更改后更新数组,ios,swift,xcode,swiftui,Ios,Swift,Xcode,Swiftui,我在SwiftUI中有一个ScooterReservationView类: ... @State var extensionIDs: [Int] = [] var body: some View { ... List(scooterExtensionVM.extensions, id: \.self) { scooterExtension in ScooterExtensionRow(_extension: scooterExtension, exten
...
@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动态。
然后是ScooteExtensionRow结构:
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()
}
}
struct ScooteExtensionRow:视图{
@EnvironmentObject变量appState:appState
@绑定变量扩展ID:[Int]
变量scooterExtension:scooterExtension
@状态变量:Bool=true
init(_扩展名:ScooteExtension,扩展名ID:Binding){
self.scooterExtension=\u扩展名
self.\u extensionId=extensionId
}
var body:一些观点{
HStack{
切换(isOn:self.$isOn){
文本(ScooteExtension.name)
}
.padding()
}
}
}
我的目标是在任何ScooterExtensionRow视图中的切换发生更改时更新ExtensionId数组。如果任何切换处于打开状态,我需要将ScooteExtension的扩展ID添加到该数组中,如果处于关闭状态,我需要从数组中删除该ID。这需要我稍后提交API请求。(我需要收集已启用/切换扩展的所有ID)
问题是:我在文档中看不到任何类型的切换回调操作,我可以在数组中追加/删除值,但在这个伟大的SwiftUI世界中,回调可能不是最好的方法
有谁能帮上忙吗?啊,我明白你在评论中的意思了。为ID创建一个新的容器类型如何。差不多
class ExtensionID: Identifiable, ObservableObject {
let id: Int
var isOn: Bool = true
init(id: Int) {
self.id = id
}
}
然后,您可以将切换绑定到isOn
属性,并基于此有条件地显示ScooterExtensionRow(或者基于给定id的任何其他更改,这些更改是关闭的,而不是从数组中实际丢失的)
这有意义吗?假设
ScooteExtension
有一个属性id
,可以按如下方式执行:
切换(isOn:Binding(get:{self.isOn}),
集合:{
self.isOn=$0
如果$0{
self.extensionId.append(self.scooterExtension.id)
}否则{
self.extensionIDs=self.extensionIDs.filter{$0!=self.scooterExtension.id}
}
})) {
文本(ScooteExtension.name)
}
extensionID
是否可以折叠成AppState
以存储(和发布)更新?我可以将extensionID放入AppState,但我认为这并不能解决我原来的问题,因为我无法在切换开关后向数组中添加/删除元素