SwiftUI中的全局与本地

SwiftUI中的全局与本地,swiftui,Swiftui,下面是下面的一些源代码日志。TestView4有一个从全局初始化的本地状态值。当全局值更改时,testView 3和4都会刷新,test view4 init(#1)和test view4 body(#2)的值不同,为什么?testview4的UI显示为#2,我希望它是#2,因为我不希望在显示testview4后全局值影响局部值。如何避免TestView4Init(#1)当全局值更改时,testview3刷新,从而导致TestView4Init(#1) 一旦你插入这一行 class TestDa

下面是下面的一些源代码日志。TestView4有一个从全局初始化的本地状态值。当全局值更改时,testView 3和4都会刷新,test view4 init(#1)和test view4 body(#2)的值不同,为什么?testview4的UI显示为#2,我希望它是#2,因为我不希望在显示testview4后全局值影响局部值。如何避免TestView4Init(#1)当全局值更改时,testview3刷新,从而导致TestView4Init(#1)


一旦你插入这一行

class TestData: ObservableObject {
    static let shared = TestData()
    @Published var selected: Bool = false
}

struct TestView3: View {
    @ObservedObject var data = TestData.shared
    @State private var sheetShowing = false
    var body: some View {
        print("test view3 body, glabel selected = \(data.selected)"); return
        VStack {
            Text("Global").foregroundColor(data.selected ? .red : .gray).onTapGesture {
                self.data.selected.toggle()
            }.padding()
            Button(action: {
                self.sheetShowing = true
                print("test view3, will show test view4")
            }) { Text("Show TestView4") }.padding()
        }.sheet(isPresented: $sheetShowing) { TestView4(selected: self.data.selected) }
    }
}

struct TestView4: View {
    @ObservedObject var data = TestData.shared
    @State private var selected = false
    init(selected: Bool) {
        self._selected = State(initialValue: selected)
        print("test view4 init, glabel selected = \(data.selected), local selected = \(self.selected)")
    }
    var body: some View {
        print("test view4 body, glabel selected = \(data.selected), local selected = \(selected)"); return
        VStack {
            Text("Local").foregroundColor(selected ? .red : .gray).onTapGesture {
                self.selected.toggle()
                print("test view4, local toggle")
            }.padding()
            Text("Global").foregroundColor(data.selected ? .red : .gray).onTapGesture {
                self.data.selected.toggle()
                print("test view4, global toggle")
            }.padding()
        }
    }
}
在结构中,数据的每次更改都会触发更新

测试你自己:

 @ObservedObject var data = TestData.shared
和场景代理中的测试调用:

class T : ObservableObject {

    @Published var a = 1
    @Published var b = 2
}

struct ContentView: View {

    @EnvironmentObject var t : T

    init() {
        print("init")
    }

    var body: some View {
        print ("update")
        return Text("Hello, World!")
    }
}

当然,我知道ObservedObject更改将触发视图更新。你不明白我的意思。不过还是谢谢你。
class T : ObservableObject {

    @Published var a = 1
    @Published var b = 2
}

struct ContentView: View {

    @EnvironmentObject var t : T

    init() {
        print("init")
    }

    var body: some View {
        print ("update")
        return Text("Hello, World!")
    }
}
 var t = T()
        let contentView = ContentView().environmentObject(t)

        Timer.scheduledTimer(withTimeInterval: 2, repeats: true) { (timer) in
            t.a += 1
        }