gpt4 book ai didi

Swift didSet for var 使用@Binding 在 child 中改变

转载 作者:行者123 更新时间:2023-12-04 09:46:08 29 4
gpt4 key购买 nike

我有以下几点:

struct ContentView: View {
@State var a = 0 {
didSet {
print("Change detected in Parent")
}
}
var body: some View {
VStack{
Text(String(self.a))
Content2(a: self.$a)
}
}
}

struct Content2: View {
@Binding var a: Int {
didSet {
print("Change detected in Child")
}
}

var body: some View {
Text(String(a)).onTapGesture {
if self.a == 1 {
self.a = 2
}else {
self.a = 1
}

}
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}



为什么是 didSet parent 从未打电话过?因为它显然正在改变。如何确保以其他方式调用或通知它?

关注 ContentView 上的变化对我来说很重要而不是将其外包给 PublishableObject .因为我想对 ContentView 做进一步的更改一旦检测到这种变化。 catch didSet在外包类上无济于事。

为了澄清我的用例如下:
我正在计算 subview 上的 Int。一旦这个 Int 达到一定数量,它应该触发一个新的 Firebase getDocuments ParentView 上的函数。

最佳答案

这是您的用例的解决方案

struct ContentView_: View {
@State var a = 0

var body: some View {
let counterBinding = Binding( // << proxy biding
get: { self.a },
set: {
self.a = $0 // decision case below
// if $0 > CONSTANT {
// // ... call getDocuments here
// }
}
)
return VStack{
Text(String(self.a))
Content2(a: counterBinding) // inject proxy !!
}
}
}

struct Content2: View {
@Binding var a: Int

var body: some View {
Text(String(a)).onTapGesture {
if self.a == 1 {
self.a = 2
}else {
self.a = 1
}
}
}
}

关于Swift didSet for var 使用@Binding 在 child 中改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62103788/

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