【问题标题】:SwiftUI onAppear called multiple times because of NavigationLink由于 NavigationLink 多次调用 SwiftUI onAppear
【发布时间】:2020-09-21 02:38:05
【问题描述】:

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})
    }
}

【问题讨论】:

  • 您是否尝试过使用 @State 布尔变量来跟踪 onAppear 是否已经出现过,方法是在 onAppear 中使用 if 条件
  • 是的,它显示它只调用了一次,但是如果你检查调试器,情况并非如此。
  • onAppear 似乎在多个场合被多次调用。例如,当 ProgressView 在呈现视图顶部的 ZStack 中声明时,呈现 ProgressView 会为呈现视图调用 onAppear - 并且不会发生任何观察到的值的其他更改。

标签: swiftui


【解决方案1】:

我向 Apple 提交了反馈,该问题已在 iOS 14.2 beta 3 中得到解决。

【讨论】:

  • 嗨 - 我仍然看到这个在 iOS 14.5 上的重现。你看到这个解决了吗?
  • 这在 14.5.1 上正常工作。我使用 iPhone 12 和 Xcode 12.5 模拟器进行了测试。没有问题。
  • @RichardWitherspoon 我还是遇到了这个问题。我正在使用 Xcode 12.5,模拟器 iPhone Mini iOS 14.5。视图的层次结构是:WindowGroup { TabView { NavigationView { TopStoriesView() } My TopStoriesView.onAppear() 在应用启动时被调用了 2 次。
  • 好吧,我的应用必须支持 iOS 13,感谢 Apple 支持错误修复(不)
【解决方案2】:

这是适合我的解决方案。应该只有一个根NavigationView,如果你把父子NavigationView然后onAppear调用多次

【讨论】:

    猜你喜欢
    • 2020-11-14
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 2021-08-01
    • 2021-02-24
    • 1970-01-01
    • 2022-11-05
    • 1970-01-01
    相关资源
    最近更新 更多