【问题标题】:SwiftUI: strange behavior with onAppearSwiftUI:onAppear 的奇怪行为
【发布时间】:2025-12-30 16:20:08
【问题描述】:

我正在尝试使用 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() 没有被调用,所以它显示了导航栏标题。

有人能解释一下吗?

【问题讨论】:

    标签: ios swift swiftui


    【解决方案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 测试

    【讨论】:

    • 非常感谢您的回答,它有效。有时会显示导航栏,例如,当我从表单的选择器返回视图,然后回到家中时。你有什么主意吗?再次感谢