【发布时间】:2020-06-30 23:46:43
【问题描述】:
我正在开发一个具有以下 ContentView 结构的应用程序
ContentView {
---HeaderView
---Collection view using QGrid (An Array of Cells), data source: an array of Structs
---A Detail View of data from a single data Struct from the data array
}
目标是使用来自 QGrid 中点击的单元格的数据更新 Detail 子视图。 我有一个单元格视图,它可以识别水龙头并正确地向控制台报告哪个单元格。 .OnTap 正确修改了 Cell 视图,但我只能将 Preference 设置附加到 Cell 视图之外,因此每次在 QGrid 中显示一个单元格时,它都会触发 Pref 的更改,而报告的单元格是网格中的最后一个,但在点击时永远不会更新到选定的单元格!
struct GlyphCell: View {
var glyph:Glyph
var body: some View {
ZStack {
Text("\(glyph.Hieroglyph)")
.lineLimit(1)
.padding(.all, 12.0)
.font(.system(size: 40.0))
.background(Color.yellow)
Text("\(glyph.Gardiner)")
.offset(x: 12, y: 26)
.foregroundColor(.blue)
}.onTapGesture {
print("Tap on \(self.glyph.Gardiner)")
DispatchQueue.main.async {
// would like to update preference in here!
}
}
.preference(key: TappedGlyphPreferenceKey.self, value: self.glyph)
.cornerRadius(6.0)
.frame(width: 90.0, height: 100.0, alignment: .center)
.previewLayout(.sizeThatFits)
}
}
这可以通过这种方法实现吗,即将 Pref 向上传递给父视图,然后向下传递给目标 Detail 视图?我在选定的数据结构上尝试了 State 和 Observables 包装器,但没有得到任何结果。欢迎任何想法!
更新:我一定对 State/Bind 有错误的理解。我在父内容视图中有一个数据结构的@State var,我使用它来更新详细信息子视图。当我将该 Struct var 的 @Bind 添加到 Cell 子视图时,编译器需要我将该 var 添加到 Cell 子视图的参数列表中。当我添加它时,我会收到各种错误。我尝试了许多变体,但放弃了 Bind 以尝试首选项。回想一下,我想将选定的 Cell Struct 向上传递到树,然后向下传递到 Detail。如果您足够大方地看一看,我可以尝试重新创建错误。
【问题讨论】:
-
如果只读文本,那么我首先想到的是
@Binding。有什么问题吗? -
我在传递包含 Struct 的数据时遇到了问题,顺便说一句,它是只读的。
-
Selection 是视图状态功能,因此您的 DetailView 可以拥有
@StateselectedGlyph并将绑定传递给每个单元格。