Swiftui 当@State变量更改时如何调用函数

Swiftui 当@State变量更改时如何调用函数,swiftui,combine,Swiftui,Combine,我有一个时间选择子视图,有两个轮子选择器,一个用于分钟,一个用于秒。这些值绑定到父视图中的两个(本地)状态变量。我正在寻找一种方法,当两个局部变量中的任何一个发生变化时,使全局状态变量“time”每次都发生变化。我不想直接将两个状态变量min/sec绑定到全局状态,因为我只希望其中一个变量以秒为单位保存时间。所以应该有一个转换时间=分钟*60+秒 我正在努力寻找一种方法来检测两个局部状态变量的值变化 下面是子视图: struct TimePicker: View { var min: B

我有一个时间选择子视图,有两个轮子选择器,一个用于分钟,一个用于秒。这些值绑定到父视图中的两个(本地)状态变量。我正在寻找一种方法,当两个局部变量中的任何一个发生变化时,使全局状态变量“time”每次都发生变化。我不想直接将两个状态变量min/sec绑定到全局状态,因为我只希望其中一个变量以秒为单位保存时间。所以应该有一个转换时间=分钟*60+秒

我正在努力寻找一种方法来检测两个局部状态变量的值变化

下面是子视图:

struct TimePicker: View {
    var min: Binding<Int>
    var sec: Binding<Int>

    var body: some View {
        HStack() {
            Spacer()
            Picker(selection: min, label: EmptyView()) {
                ForEach((0...9), id: \.self) { ix in
                    Text("\(ix)").tag(ix)
                }
            }.frame(width: 40).clipped().pickerStyle(WheelPickerStyle())
            Text("Min.")
            Picker(selection: sec, label: EmptyView()) {
                ForEach((0...59), id: \.self) { ix in
                    Text("\(ix)").tag(ix)
                }
            }.frame(width: 40).clipped().pickerStyle(WheelPickerStyle())
            Text("Sec.")
            Spacer()
        }
    }
}
struct TimePicker:视图{
var-min:绑定
var-sec:绑定
var body:一些观点{
HStack(){
垫片()
选择器(选择:最小,标签:EmptyView()){
ForEach((0…9),id:\.self){ix in
文本(“\(ix)”).tag(ix)
}
}.frame(宽度:40).clipped().pickerStyle(车轮扒手样式())
文本(“最小值”)
选择器(选择:秒,标签:EmptyView()){
ForEach((0…59),id:\.self){ix in
文本(“\(ix)”).tag(ix)
}
}.frame(宽度:40).clipped().pickerStyle(车轮扒手样式())
文本(“第节”)
垫片()
}
}
}

我认为您需要包装您的全局变量

    class TimeObject : BindableObject {
    let didChange = PassthroughSubject<Void, Never>()

    var time:Int = 0 {
        didSet {
            didChange.send(())
        }
    }
}

不幸的是,您没有机会测试

您可以在主视图中使用CombineTest

               struct MainTimeView: View{
            @State private var min : Int = 0
            @State private var sec : Int = 0

           @State private var myTime: Int = 0
             var body: some View {

                TimePicker(min: $min, sec: $sec).onReceive(Publishers.CombineLatest(Just(min), Just(sec))) {
                    self.myTime = $0 * 60 + $1
                    print(self.myTime)
                }
            }
        }
TimePicker..environmentObject(TimeObject())
               struct MainTimeView: View{
            @State private var min : Int = 0
            @State private var sec : Int = 0

           @State private var myTime: Int = 0
             var body: some View {

                TimePicker(min: $min, sec: $sec).onReceive(Publishers.CombineLatest(Just(min), Just(sec))) {
                    self.myTime = $0 * 60 + $1
                    print(self.myTime)
                }
            }
        }