SwiftUI
是苹果推出的一个声明式 UI 框架,用于构建 macOS、iOS、watchOS 和 tvOS 应用程序。onAppear
是 SwiftUI 中的一个修饰符,用于在视图即将显示时执行某些操作。
NavigationView
是 SwiftUI 中的一个容器视图,用于管理导航链接和堆栈。TabView
则是一个容器视图,允许用户在多个视图之间切换。
当 NavigationView
放在 TabView
内部时,onAppear
可能会被调用两次。这是因为 TabView
在切换标签时会重新加载其子视图,而 NavigationView
在进入新的导航链接时也会重新加载其子视图。
TabView
中的标签时,TabView
会重新加载其子视图,这会导致 NavigationView
和其子视图的 onAppear
被调用。NavigationView
中导航到新的链接时,NavigationView
会重新加载其子视图,这也会导致 onAppear
被调用。为了避免 onAppear
被多次调用,可以使用 @StateObject
或 @ObservedObject
来管理视图的状态,并在状态变化时执行操作。
import SwiftUI
struct ContentView: View {
@StateObject private var viewModel = ViewModel()
var body: some View {
TabView {
NavigationView {
Text("Tab 1")
.onAppear {
viewModel.didAppear()
}
.navigationTitle("Tab 1")
}
.tag(0)
NavigationView {
Text("Tab 2")
.onAppear {
viewModel.didAppear()
}
.navigationTitle("Tab 2")
}
.tag(1)
}
}
}
class ViewModel: ObservableObject {
@Published var appeared = false
func didAppear() {
if !appeared {
appeared = true
print("onAppear called")
}
}
}
这个问题常见于需要在 NavigationView
或 TabView
中执行某些初始化操作或数据加载操作的场景。通过上述解决方案,可以确保这些操作只在视图首次显示时执行一次。
希望这个回答能帮助你理解 SwiftUI
中 onAppear
被调用两次的原因,并提供有效的解决方案。
领取专属 10元无门槛券
手把手带您无忧上云