#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(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})
}
}
Комментарии:
1. Вы пробовали использовать логическую переменную @State, чтобы отслеживать, было ли onAppear уже раньше, используя условие if внутри onAppear
2. Да, и это показывает, что он вызывается только один раз, однако, если вы проверяете отладчик, это не так.
3.
onAppear
кажется, вызывается несколько раз несколько раз. Например, представление progressView вызываетonAppear
вызов для представления представления, когда progressView объявлен в ZStack поверх представления представления — и никаких других изменений каких-либо наблюдаемых значений не происходит.
Ответ №1:
Я отправил отзыв в Apple, и это было решено в iOS 14.2 beta 3.
Комментарии:
1. Привет — я все еще вижу это повторение в iOS 14.5. Вы видите это исправленным?
2. Это работает правильно на 14.5.1. Я тестировал с iPhone 12, а также с симулятором Xcode 12.5. Никаких проблем.
3. @RichardWitherspoon У меня все еще есть эта проблема. Я использую Xcode 12.5, симулятор iPhone Mini iOS 14.5. Иерархия представлений такова:
WindowGroup { TabView { NavigationView { TopStoriesView() }
My TopStoriesView.onAppear() вызывается 2 раза при запуске приложения.4. Ну, мое приложение должно поддерживать iOS 13 спасибо Apple за поддержку исправления ошибок (нет)
Ответ №2:
Это решение, которое работает для меня. Должен быть только один корень NavigationView
, если вы ставите родительский и дочерний NavigationView
элементы, а затем onAppear
вызываете несколько раз