【发布时间】:2021-07-26 11:05:42
【问题描述】:
XCode 版本 12.5 (12E262) - Swift 5
为了简化此示例,我创建了一个 testObj 类并将一些项目添加到数组中。 假设我想在屏幕上渲染按钮(见下面的预览),一旦你点击按钮,它应该设置 testObj.isSelected = true 触发按钮改变背景颜色。
我知道它会将值更改为 true,但不会触发按钮更改其颜色。
示例如下:
//
// TestView.swift
//
import Foundation
import SwiftUI
import Combine
struct TestView: View {
@State var arrayOfTestObj:[testObj] = [
testObj(label: "test1"),
testObj(label: "test2"),
testObj(label: "test3")
]
var body: some View {
VStack {
ForEach(arrayOfTestObj, id: \.id) { o in
HStack {
Text(o.label)
.width(200)
.padding(20)
.background(Color.red.opacity(o.isSelected ? 0.4: 0.1))
.onTapGesture {
o.isSelected.toggle()
}
}
}
}
}
}
class testObj: ObservableObject {
let didChange = PassthroughSubject<testObj, Never>()
var id:String = UUID().uuidString {didSet {didChange.send((self))}}
var label:String = "" {didSet {didChange.send((self))}}
var value:String = "" {didSet {didChange.send((self))}}
var isSelected:Bool = false {didSet {didChange.send((self))}}
init (label:String? = "") {
self.label = label!
}
}
struct TestView_Previews: PreviewProvider {
static var previews: some View {
TestView()
}
}
如果我将 ForEach 更新为...
ForEach($arrayOfTestObj, id: \.id) { o in
...然后我收到此错误:
键路径值类型“_”无法转换为上下文类型“_”
如何更改 testObj 以使其可绑定?
非常感谢任何帮助。
【问题讨论】:
-
你不能在 for each 循环中放置一个绑定数组。您的对象是 ObservableObjects,因此只需在视图中使用 ObservedObject 包装器来显示您的行并在 ObservableObject 中使用 Published 包装器
标签: swift swiftui observableobject