gpt4 book ai didi

ios - SwiftUI:是否可以从 .OnTapGesture 中触发 set PreferenceKey()?

转载 作者:行者123 更新时间:2023-12-01 21:58:44 24 4
gpt4 key购买 nike

我正在开发具有以下 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 subview 。
我有一个单元格 View ,它可以识别水龙头并正确地向控制台报告哪个单元格。 .OnTap 正确修改了 Cell View ,但我只能将 Preference 设置附加到 Cell View 之外,因此每次在 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 向上传递到父 View ,然后向下传递到目标 Detail View ?我在选定的数据结构上尝试了 State 和 Observables 包装器,但没有得到任何结果。欢迎任何想法!

更新:我一定对状态/绑定(bind)有错误的理解。我在父内容 View 中有一个数据结构的@State var,我使用它来更新详细信息 subview 。当我将该 Struct var 的 @Bind 添加到 Cell subview 时,编译器需要我将该 var 添加到 Cell subview 的参数列表中。当我添加它时,我会收到各种错误。我尝试了许多变体,但放弃了 Bind 以尝试首选项。回想一下,我想将选定的 Cell Struct 向上传递到树,然后向下传递到 Detail。如果您足够大方地偷看一下,我可以尝试重新创建错误。

最佳答案

尝试以下(由于缺少许多依赖项而无法测试它,所以只是想法)

struct GlyphCell: View {

var glyph:Glyph

@State private var selected = false // << track own selection
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)")
self.selected.toggle() // << async not required here
}
.cornerRadius(6.0)
.frame(width: 90.0, height: 100.0, alignment: .center)
.previewLayout(.sizeThatFits)
.background(Group {
if self.selected {
// activate preference only when selected
Color.clear
.preference(key: TappedGlyphPreferenceKey.self, value: self.glyph)
}
}
}
}

关于ios - SwiftUI:是否可以从 .OnTapGesture 中触发 set PreferenceKey()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60763999/

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