【问题标题】:Update an array after Toggle change in SwiftUI在 SwiftUI 中切换更改后更新数组
【发布时间】:2020-06-13 01:46:14
【问题描述】:

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

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

【问题讨论】:

  • extensionIDs 是否可以折叠成 AppState 以便在那里存储(和发布)更新?
  • 我可以将 extensionIDs 放入 AppState,但我认为它不能解决我原来的问题,因为我无法在切换开关后向该数组添加/删除元素

标签: ios swift xcode swiftui


【解决方案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)
}

【讨论】:

    【解决方案2】:

    啊,我明白你在评论中所说的话。 id 的新容器类型怎么样。类似的东西

    class ExtensionID: Identifiable, ObservableObject {
        let id: Int
        var isOn: Bool = true
    
        init(id: Int) {
            self.id = id
        }
    }
    

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

    这有意义吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      相关资源
      最近更新 更多