【发布时间】: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