SwiftUI不会使用嵌套的NavigationLink目标中的ObservedObject更新UI

问题描述 投票:0回答:1

我目前有一个应用程序正在从API提取数据,在根视图(称为Home)中,一切正常,在第二视图(称为User View)中,一切正常,但现在在第三个视图中(团队视图)仅此视图的ObservedObject不起作用。

最奇怪的部分是,如果用户直接导航到团队视图,那么一切都会按预期进行。

每个视图都有它自己的ObservedObject,正在加载的数据仅属于该视图

每个视图之间的导航由NavigationLink进行

这里是我如何进行加载和导航的示例。

struct HomeView: View {
   @ObservedObject var viewModel = HomeViewModel()
   var body: some View {
       VStack {
           NavigationLink(destination: UserView(userId: viewModel.userId))
           NavigationLink(destination: TeamView(teamId: viewModel.teamId))
       }
   }
}

struct TeamView: View {
    @ObservedObject var viewModel = TeamViewModel()
    @State var teamId: String = ""
    var body: some View {
        Text(viewModel.name)
            .onAppear() { viewModel.loadData(id: teamId) }
    }
}

struct UserView: View {
    @ObservedObject var viewModel = UserViewModel()
    @State var userId: String = ""
    var body: some View {
        VStack {
            Text(viewModel.name)
            NavigationLink(destination: TeamView(teamId: viewModel.teamId))
        }
            .onAppear() { viewModel.loadData(id: userId) }
    }
}

从示例中您可以看到,用于加载数据的函数在视图模型中,并在视图出现时加载。

一切正常,但是当我到达堆栈的第3级时,数据不会在视图中更新。我以为可能是线程,但提取完成后我正在使用DispatchQueue.main.async

模型上所有必需的变量都标记为@Published

总的来说,以下流程起作用

HomeView -> TeamView
HomeView -> UserView

但是在最后一个视图上,它的确加载了数据,但没有更新视图

HomeView -> UserView -> TeamView
ios swift swiftui
1个回答
0
投票

我复制了您的代码行为,该问题是由于快速导航所致。这是怎么回事

© www.soinside.com 2019 - 2024. All rights reserved.