如何从对象数组创建切换绑定? [英] How to create Toggle binding from array of objects?
问题描述
关于这个主题有几个有用的问题,但我发现的所有问题要么使用早期测试版中已弃用的语法(例如 BindableObject),要么不需要传递绑定(例如,到 Toggle).
There are several useful questions on this topic, but all I've found either use deprecated syntax from earlier betas (e.g., BindableObject) or do not require a binding be passed (e.g., to a Toggle).
我想创建一个绑定到数组元素的切换列表.我尝试了很多方法,但语法永远不正确.下面的版本最匹配 an现有问题.
I want to create a list of Toggles that are bound to elements in an array. I've tried many methods, but the syntax is never corrrect. The version below most closely matches the answers to an existing question.
struct Item: Identifiable {
var id: String { self.name }
var name: String
var enabled: Bool
}
final class ItemSet: ObservableObject {
@Published var items: [Item]
init() {
items = [
Item(name: "aaa", enabled: true),
Item(name: "bbb", enabled: false),
Item(name: "ccc", enabled: true)
]
}
}
var myItems = ItemSet()
struct ContentView: View {
@ObservedObject var items: ItemSet
var body: some View {
List {
ForEach(items.items) { item in
Toggle(item.name, isOn: $item.enabled)
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView(items: myItems)
}
}
我在 Xcode 11.1 中得到的编译器错误是:
The compiler error I get in Xcode 11.1 is:
使用未解析的标识符$item"
Use of unresolved identifier '$item'
在定义 Toggle 的行上.
on the line where Toggle is defined.
我的印象是每个 Item
本身都需要是一个 ObservableObject
并启用 @Published var: Bool
参数,但是我也无法使其正常工作,并且所有 stackoverflow 答案似乎都在说避免使 Item
本身成为 ObservableObject
.
I was under the impression that each Item
would itself need to be an ObservableObject
with a @Published var enabled: Bool
parameter, but I have not been able to get that working either, and all stackoverflow answers seems to say avoid making Item
itself ObservableObject
.
任何帮助将不胜感激.
推荐答案
您将 items
(它是当前值主题)的属性包装器与 Toggle 的绑定参数混淆了
期待.请参阅以下绑定的更正实施:
You are confusing the property wrapper for items
(which is a current value subject) with the binding parameter that a Toggle
expects. See corrected implementation with binding below:
import SwiftUI
import Combine
struct Item: Identifiable {
var isEnabled: Binding<Bool>
var id: String { self.name }
var name: String
init(name: String, enabled enabledValue: Bool) {
self.name = name
let enabled = CurrentValueSubject<Bool, Never>(enabledValue)
isEnabled = Binding<Bool>(
get: { enabled.value },
set: { enabled.value = $0}
)
}
}
final class ItemSet: ObservableObject {
@Published var items: [Item]
init() {
items = [
Item(name: "aaa", enabled: true),
Item(name: "bbb", enabled: false),
Item(name: "ccc", enabled: true)
]
}
}
var myItems = ItemSet()
struct ContentView: View {
@ObservedObject var items: ItemSet
var body: some View {
List {
ForEach(items.items) { item in
Toggle(isOn: item.isEnabled, label: { Text (item.name) })
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView(items: myItems)
}
}
这篇关于如何从对象数组创建切换绑定?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!