gpt4 book ai didi

swiftui - 如何将 SwiftUI 元素绑定(bind)到字典中的值?

转载 作者:行者123 更新时间:2023-12-01 23:16:04 25 4
gpt4 key购买 nike

我有一本字典,其中包含我想要“过滤”的各种值。所以我正在做这样的事情

struct ExampleView : View {

@EnvironmentObject var externalData : ExternalData

var body: some View {
VStack {
ForEach(externalData.filters) { (v : (String, Bool)) in
Toggle(isOn: $externalData.filters[v.0], label: {
Text("\(v.0)")
})
}
}
}
}

final class ExternalData : BindableObject {

let didChange = PassthroughSubject<ExternalData, Never>()

init() {
filters["Juniper"] = true
filters["Beans"] = false
}

var filters : Dictionary<String, Bool> = [:] {
didSet {
didChange.send(self)
}
}
}

This question似乎相关,但放置动态似乎没有帮助,在这种情况下我无法弄清楚如何做 NSObject 继承的事情。现在,这段代码给了我这个错误:
Cannot subscript a value of type 'Binding<[String : Bool]>' with an argument of type 'String'

但是尝试移动 $ 或以各种方式使用 paren 似乎无济于事。如何将切换绑定(bind)到字典中的值?我可以为每个值进行手动切换,但这会使代码变得脆弱,因为(除其他原因外)潜在的过滤器值基于可能在某些时候具有新值的数据集。

我知道在迭代它们之前我真的应该(以某种方式)对键进行排序,以便排序是一致的,但这会使这个示例变得困惑,所以我忽略了那个代码。

最佳答案

我设法通过为每个过滤器使用自定义绑定(bind)来完成工作。

final class ExternalData: BindableObject {
let didChange = PassthroughSubject<Void, Never>()

var filters: Dictionary<String, Bool> = [:] {
didSet {
didChange.send(())
}
}

init() {
filters["Juniper"] = true
filters["Beans"] = false
}

var keys: [String] {
return Array(filters.keys)
}

func binding(for key: String) -> Binding<Bool> {
return Binding(getValue: {
return self.filters[key] ?? false
}, setValue: {
self.filters[key] = $0
})
}
}

keys属性列表 filters键为 String以便可以显示(使用 ForEach(externalData.keys) )
binding(for:)方法,创建自定义 Binding对于给定的键。此绑定(bind)提供给 Toggle读取/写入包装字典中的当前值。

View 代码:

struct ExampleView : View {

@EnvironmentObject var externalData : ExternalData

var body: some View {
VStack {
ForEach(externalData.keys) { key in
Toggle(isOn: self.externalData.binding(for: key)) {
Text(key)
}
}
}
}
}

关于swiftui - 如何将 SwiftUI 元素绑定(bind)到字典中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56978746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com