首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有ObservableObject属性的ObservableObject不会触发SwiftUI更新

具有ObservableObject属性的ObservableObject不会触发SwiftUI更新
EN

Stack Overflow用户
提问于 2020-11-16 13:52:02
回答 1查看 401关注 0票数 1
代码语言:javascript
复制
// 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),则会触发更新,但不是只更新内容视图导航的属性.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-16 14:04:09

如果要更新对象,则视图必须显式地观察ObservableObject。

在你的情况下,你观察到的父母是可观察的,但不是内在可观察的。场景中的contentViewNavigation本身不会改变,因为它只是对内部对象的引用。

因此,解决方案可能如下面的演示所示

代码语言:javascript
复制
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)
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64859319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档