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 事件调用回扫手势动作

onAppear 中的 SwiftUI 异步数据获取

SwiftUI onAppear 被调用两次

SwiftUI 导航链接和@State 在“onAppear()”中有问题

每次视图出现时,SwiftUI .onAppear withAnimation 都会加快速度。为啥?

SwiftUI解决List子项无法正确触发onAppear和onDisappear事件的问题