ios - SwiftUI:onAppear 的奇怪行为

标签 ios swift swiftui

我正在尝试使用 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/

相关文章:

objective-c - For 循环会按照此模式在索引 : 0, 1 然后 1,2 然后 2,3 然后 3,4 处给我对象,直到数组计数?

ios - 核心动画 setFromValue

ios - Swift - 将图像添加到圆形 View

ios - 在文本中添加无限行(SwiftUI)

ios - 在展开 UITableVewCell 自定义单元格类的 Optional 值时意外发现 nil

ios - UIView 上的 inputAccessoryView

ios - didSelectRowAt 上的图像没有变化

ios - 如何将 array.indexOf 与协议(protocol)一起使用?

ios - 使用 ForEach 在 SwiftUI 中按下按钮时制作独特的工作表?

swiftui - 我无法在 SwiftUI 中将 NavigationItemTitle 覆盖到 TabView 中