问题描述
我有一个使用以下布局的 watchOS 应用程序:
NavigationView {
if !HKHealthStore.isHealthDataAvailable() {
ContentNeedHealthKitView()
} else if !isAuthorized {
ContentUnauthorizedView()
} else {
TabView(selection: $selection) {
WeightView()
.navigationTitle("Weight")
.tag(1)
.onAppear {
print("Appear!")
}
.onDisappear {
print("Disappear!")
}
SettingsView()
.navigationTitle("Settings")
.tag(2)
}
}
}
遗憾的是,OnAppear
和 OnDisappear
操作仅在从视图转换到另一个第二次后执行。第一次向右滑动时,什么也没有发生。
解决方法
您应该提供一个最小的可重现示例(请参阅 https://stackoverflow.com/help/minimal-reproducible-example)。
你的行也产生了编译器错误。使用 onAppear
的正确方法是这样的:
.onAppear {
}
这是一个工作示例,一切都按预期工作。您还应该将 onAppear
ViewModifier 放置到子视图中。
import SwiftUI
struct WeightView: View {
var body: some View {
Text("WeightView")
.onAppear {
print("Appear!")
}
.onDisappear {
print("Disappear!")
}
}
}
struct SettingsView: View {
var body: some View {
Text("SettingsView")
}
}
struct ContentView: View {
@State var selection = 1
@State var isAuthorized = false
var body: some View {
NavigationView {
if !isAuthorized {
Button("authorize") {
isAuthorized.toggle()
}
} else {
TabView(selection: $selection) {
WeightView()
.navigationTitle("Weight")
.tag(1)
SettingsView()
.navigationTitle("Settings")
.tag(2)
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}