Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中@Binding变量的didSet_Swift_Swiftui_Combine - Fatal编程技术网

Swift中@Binding变量的didSet

Swift中@Binding变量的didSet,swift,swiftui,combine,Swift,Swiftui,Combine,通常,我们可以在swift中使用didSet来监控变量的更新。但是它对@绑定变量不起作用。例如,我有以下代码: @Binding var text { didSet { ...... } } 但是从来没有调用过didSet。知道吗?谢谢。在@Binding上,您不应该需要didSet观察员 如果您想要一个didSet,因为您想在text更改时计算其他要显示的内容,只需计算它即可。例如,如果要显示文本中的字符计数: struct ContentView: View {

通常,我们可以在swift中使用
didSet
来监控变量的更新。但是它对
@绑定
变量不起作用。例如,我有以下代码:

@Binding var text {
   didSet {
       ......
   }
}

但是从来没有调用过
didSet
。知道吗?谢谢。

@Binding
上,您不应该需要
didSet
观察员

如果您想要一个
didSet
,因为您想在
text
更改时计算其他要显示的内容,只需计算它即可。例如,如果要显示
文本中的字符计数

struct ContentView: View {
    @Binding var text: String

    var count: Int { text.count }

    var body: some View {
        VStack {
            Text(text)
            Text(“count: \(count)”)
        }
    }
}

如果您想观察
文本
,因为您想对数据模型进行其他更改,那么从
视图
观察更改是错误的。您应该从模型中的其他位置或控制器对象中观察更改,而不是从
视图中观察更改。请记住,您的
视图
类型,而不是引用类型。SwiftUI会在需要时创建它,并可能存储它的多个副本,或者根本不存储副本。

您可以始终使用
onReceive
(iOS 13+)或
onChange
(iOS 14+):


你能提供更多的代码吗?始终使用
didSet
。问题在于您没有提供的代码。没有在@Binding上调用DidSet,因为绑定没有设置。改变的是绑定中包装的值。你能解释一下你想在didSet中实现什么吗?看看这个答案:它是一个
UIViewRepresentable
?然后可以使用
updateUIView
<每次绑定或状态更改时都会调用code>updateUIView
。感谢您的回复。我知道你的意思。它在
body
功能中工作。但就我而言,我不是从
视图继承的。相反,我是从一个
UIViewRepresentable
继承的。如果
didSet
起作用,对我来说更容易。
UIViewRepresentable
View
的一个子协议。符合
UIViewRepresentable
的任何类型都符合
View
。这不允许在绑定变量的值更改时刷新视图。在上面的代码片段中,“count”需要发布,但您不能在计算属性上拥有已发布的包装器。(回复:我之前的评论,我指的是在ViewModel中管理“text”绑定变量和“count”计算变量的情况)否,
count
不需要发布,因为它完全是根据SwiftUI跟踪的值按需计算的。
count
getter调用
text
getter,因此当程序访问
count
时,SwiftUI会注意到对
text
的依赖性。
import Combine
import SwiftUI

struct ContentView: View {
    @State private var counter = 1
    
    var body: some View {
        ChildView(counter: $counter)
        Button("Increment") {
            counter += 1
        }
    }
}

struct ChildView: View {
    @Binding var counter: Int
    
    var body: some View {
        Text(String(counter))
            .onReceive(Just(counter)) { value in
                print("onReceive: \(value)")
            }
            .onChange(of: counter) { value in
                print("onChange: \(value)")
            }
    }
}