// NavigationState.swift
class NavigationState: ObservableObject {
@Published var contentViewNavigation = ContentViewNavigationState()
//@Published var selectedTab = 0
}
// App.swift
@main
struct SwiftUIDeepLinkApp: App {
@StateObject private var navigationAppState = NavigationState()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(navigationAppState)
.onAppear(perform: {
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
print("Dispatch called")
navigationAppState.contentViewNavigation.selectedTab = 1
//navigationAppState.selectedTab = 1
}
})
}
}
}
// ContentView.swift
class ContentViewNavigationState: ObservableObject {
@Published var selectedTab = 0
}
struct ContentView: View {
@EnvironmentObject var navigationState: NavigationState
var body: some View {
TabView(selection: $navigationState.contentViewNavigation.selectedTab) {
HomeContainerFlow1()
.tabItem { Text("Flow 1") }
.tag(0)
HomeContainerFlow2()
.embededInNavigation()
.tabItem { Text("Flow 2") }
.tag(1)
}.onReceive(navigationState.contentViewNavigation.$selectedTab, perform: { output in
print("Value changed: \(output)")
})
}
}如您所见,我正在定义一个全局状态("NavigationState")来处理应用程序的导航(即Tab选择)。因此,我有一个ObservableObject (NavigationState),它将为每个屏幕导航状态(即ContentViewNavigationState -另一个ObservableObject)提供属性。
实际行为
在本例中,我在修改App.swift文件中DispatchQueue.asyncAfter中的状态,状态正在改变(因为ContentView的onReceive修饰符正在显示更新值),但不会触发ContentView中的任何更新。
期望行为
应根据状态更改选定的选项卡。
selectedTab),则会触发更新,但不是只更新内容视图导航的属性.。
发布于 2020-11-16 14:04:09
如果要更新对象,则视图必须显式地观察ObservableObject。
在你的情况下,你观察到的父母是可观察的,但不是内在可观察的。场景中的contentViewNavigation本身不会改变,因为它只是对内部对象的引用。
因此,解决方案可能如下面的演示所示
struct ContentView: View {
@EnvironmentObject var navigationState: NavigationState
var body: some View {
// separate view which observe inner ObservableObject
MainView(contentNavigation: navigationState.contentViewNavigation)
}
}
struct MainView: View {
@ObservedObject var contentNavigation: ContentViewNavigationState
var body: some View {
TabView(selection: $contentNavigation.selectedTab) {
HomeContainerFlow1()
.tabItem { Text("Flow 1") }
.tag(0)
HomeContainerFlow2()
.embededInNavigation()
.tabItem { Text("Flow 2") }
.tag(1)
}
}
}https://stackoverflow.com/questions/64859319
复制相似问题