从fullScreenCover返回时如何触发onAppear

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

onAppear 不触发

struct ProfileView: View {
    @StateObject var viewModel = ProfileViewViewModel()
    var body: some View {
        NavigationView {
            VStack {
                if let user = viewModel.user {
                    profile(user: user)
                } else {
                    Text("Loading Profile...")
                }
            }
            .navigationTitle("Profile")
        }
        .onAppear {
            viewModel.fetchUser() //this is the problem
        }
        .fullScreenCover(isPresented: $viewModel.showingPreview) {
            PreviewAvatarView()
        }
    }
}

我意识到当我关闭全屏覆盖时 onAppear 没有触发。

ios swift iphone swiftui swift3
2个回答
0
投票

您可以使用

onAppear
,而不是使用
task

struct ProfileView: View {
    @StateObject var viewModel = ProfileViewViewModel()
    var body: some View {
        NavigationView {
            VStack {
                if let user = viewModel.user {
                    profile(user: user)
                } else {
                    Text("Loading Profile...")
                }
            }
            .navigationTitle("Profile")
        }
        .task(id: viewModel.showingPreview) {
            guard !viewModel.showingPreview else {return} //Check for false
    
            viewModel.fetchUser() //this is the problem
        }
        .fullScreenCover(isPresented: $viewModel.showingPreview) {
            PreviewAvatarView()
        }
    }
}

task
将运行
onAppear
并且当
Bool
false
时。


0
投票

onAppear
不会触发,因为你的底层视图没有出现——覆盖它的视图正在消失,这不是一回事。

但是,

fullScreenCover
有一个很少使用的可选参数,
onDismiss
,它可能会满足您的需求,例如:

.fullScreenCover(
  isPresented: $viewModel.showingPreview,
  onDismiss: { view model.fetchUser() }
) {
  PreviewAvatarView()
}

苹果文档

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