由于NavigationLink,SwiftUI onAppear被多次调用

由于NavigationLink,SwiftUI onAppear被多次调用,swiftui,Swiftui,SwiftUI onAppear在导航链接内时会被多次调用。在我提供的示例中,它被调用了5次。这也会触发其StateObject初始值设定项被调用5次。如果将导航链接注释掉,它将按预期执行 这已经在Xcode 12 GM和Xcode 12.2以及iOS 14 GM和iOS 14.2 beta 1上进行了测试。也作为反馈FB8721761提交 struct ContentView: View { var body: some View { NavigationLink(de

SwiftUI onAppear在导航链接内时会被多次调用。在我提供的示例中,它被调用了5次。这也会触发其StateObject初始值设定项被调用5次。如果将导航链接注释掉,它将按预期执行

这已经在Xcode 12 GM和Xcode 12.2以及iOS 14 GM和iOS 14.2 beta 1上进行了测试。也作为反馈FB8721761提交

struct ContentView: View {
    var body: some View {
        NavigationLink(destination: Color.red, label: {
            ImageView()
                .frame(width: 166.66, height: 250)
                .cornerRadius(10)
        })
    }
}

struct ImageView: View{
    @StateObject private var downloader = Downloaded(url: URL(string: "https://image.tmdb.org/t/p/w342/TnOeov4w0sTtV2gqICqIxVi74V.jpg")!)

    var body: some View{
        Rectangle()
            .onAppear{
                print("Appeared")
            }
    }
}

class Downloaded: ObservableObject{
    var cancellable: AnyCancellable?
    let url: URL

    init(url: URL){
        self.url = url
        download()
    }

    func download(){
        cancellable = URLSession.shared.dataTaskPublisher(for: url)
            .map(\.data)
            .receive(on: DispatchQueue.main)
            .eraseToAnyPublisher()
            .sink(receiveCompletion: { _ in
                print("Finished downloading")
            }, receiveValue: {_ in})
    }
}

我向苹果公司提交了一份反馈,这在iOS 14.2 beta 3中得到了解决。

您是否尝试过使用@State布尔变量来跟踪onAppear之前是否已经存在过,方法是在OnAppearies中使用if条件,结果显示它只被调用一次,但是,如果您检查调试器,则情况并非如此。
onAppear
似乎多次被调用。例如,当ProgressView在呈现视图顶部的ZStack中声明时,呈现ProgressView会导致为呈现视图调用
onAppear
,并且不会对任何观察到的值进行任何其他更改。嗨,我仍然看到在iOS 14.5中进行这种重新设置。您是否看到此项已修复?这项功能在14.5.1中正常工作。我用iPhone12和Xcode 12.5模拟器进行了测试。没有问题。@RichardWitherspoon我仍然有这个问题。我使用的是Xcode 12.5,模拟器iPhone Mini iOS 14.5。视图的层次结构是:
WindowGroup{TabView{NavigationView{TopStoriesView()}
My TopStoriesView.onAppear()在应用程序启动时被调用两次。