我正在尝试使用 SwiftUI 创建一个 IOS 应用程序,该应用程序使用 NavigationView
并在第一个 View 上隐藏导航栏(并且仅在第一个 View 上)。
所以我创建了一个 ObservableObject
class NavBarShowViewModel: ObservableObject {
@Published var isHidden: Bool = true
}
在我的内容 View 中
struct ContentView: View {
@ObservedObject var navBarShowViewModel = NavBarShowViewModel()
var body: some View {
NavigationView {
Home()
.navigationBarHidden(self.navBarShowViewModel.isHidden)
}
.environmentObject(self.navBarShowViewModel)
}
}
现在在家里我有:
struct Home: View {
@EnvironmentObject var navBarShowViewModel: NavBarShowViewModel
var body: some View {
VStack {
HStack {
NavigationLink(destination: FirstPage()) {
Text("Go!")
}
Text("Hello World")
Spacer()
}
.navigationBarTitle("Home")
}
.onAppear(perform: {
self.navBarShowViewModel.isHidden = true
})
}
}
现在 FirstPage()
具有与 Home()
完全相同的结构,只是标题不同
.navigationBarTitle("First Page")
onAppear有以下代码:
.onAppear(perform: {
self.navBarShowViewModel.isHidden = false
})
通过此设置,应用程序可以运行。
但是,如果在 FirstPage()
内,我会进一步导航,例如转到 SecondPage()
(这是为了简单起见,与 FirstPage() 相同)
具有不同的标题),然后回击直到我返回主页,Home()
上的 onAppear
未调用,因此它显示导航栏标题.
有人能解释一下吗?
最佳答案
它是关于 SwiftUI 引擎如何跟踪 View 以及它是否真的出现...无论如何,它是什么可以确定,因为它是子 View 如何出现/消失在导航堆栈上,因此可能的解决方案是在 FirstPage
中添加 onDisappear
,例如
struct FirstPage: View {
@EnvironmentObject var navBarShowViewModel: NavBarShowViewModel
var body: some View {
... other code here
.onAppear(perform: {
self.navBarShowViewModel.isHidden = false
})
.onDisappear(perform: {
self.navBarShowViewModel.isHidden = true
})
}
}
使用 Xcode 12.4/iOS 14.4 进行测试
关于ios - SwiftUI:onAppear 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66834496/