SwiftUI:onAppear 的奇怪行为
Posted
技术标签:
【中文标题】SwiftUI:onAppear 的奇怪行为【英文标题】:SwiftUI: strange behavior with onAppear 【发布时间】:2021-03-27 17:58:49 【问题描述】:我正在尝试使用 SwiftUI 创建一个 ios 应用程序,该应用程序使用 NavigationView
并在第一个视图上隐藏导航栏(并且仅在第一个视图上)。
所以我创建了一个 ObservableObject
class NavBarShowViewModel: ObservableObject
@Published var isHidden: Bool = true
在我的内容视图中
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()
相同,但标题不同)然后回击直到我返回主页,@987654332 @ 这里Home()
没有被调用,所以它显示了导航栏标题。
有人能解释一下吗?
【问题讨论】:
【参考方案1】:这是关于 SwiftUI 引擎如何跟踪视图以及它是否真的出现...无论如何,它是什么可以确定,因为它是 child 视图出现/消失的方式在导航堆栈上,因此可能的解决方案是在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 测试
【讨论】:
非常感谢您的回答,它有效。有时会显示导航栏,例如,当我从表单的选择器返回视图,然后回到家中时。你有什么主意吗?再次感谢以上是关于SwiftUI:onAppear 的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI 视图 onAppear 事件调用回扫手势动作
SwiftUI 导航链接和@State 在“onAppear()”中有问题