我发现了一个符合我口味的弹出窗口的奇怪行为。我希望它显示一个视图PopoverItem
and number
,两者均应从onTapGesture
in ForEach
。问题是弹出窗口总是显示默认值number
第一次点击时,它会按预期工作。
错误(左)和右行为(第二次单击时按预期工作)。 iOS 上相同,与Button
我能够让它工作Binding
但我想找到一个更好的解决方案来呈现弹出窗口,并找出为什么它不能按我的预期工作。
我的主要视图如下所示:
struct PopoverTest: View {
let array: [PopoverItem] = [PopoverItem("First title"), PopoverItem("second title"), PopoverItem("third title")]
@State var show: PopoverItem? = nil
@State var number: Int = 0
var body: some View {
VStack {
ForEach(Array(array.enumerated()), id: \.element.id) { number, item in
MyPopover(number: number + 1, item: item)
.onTapGesture {
self.number = number + 1
self.show = item
}
}
}
.popover(item: $show) { item in
MyPopover(number: number, item: item)
}
}
}
以及弹出窗口和项目:
struct MyPopover: View {
let number: Int
let item: PopoverItem
var body: some View {
HStack {
Text("\(number)")
Text(item.text)
}.padding()
}
}
struct PopoverItem: Identifiable {
let id = UUID()
let text: String
init(_ text: String) { self.text = text }
}
信息inside弹出窗口已通过仅通过项目, ie in
.popover(item: $show) { item in
MyPopover(number: number, item: item) // << number in only at init !!
}
所以这种情况对于 popover 无效
.onTapGesture {
self.number = number + 1 // << changed only in state !!
self.show = item // passed in popover
}
所以如果你需要number
in MyPopover
,你必须通过它传递item
通过引入新的财产PopoverItem
for it.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)