我目前有一个应用程序正在从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
我复制了您的代码行为,该问题是由于快速导航所致。这是怎么回事