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