【问题标题】:SwiftUI onAppear called twice when NavigationView inside TabView当 TabView 内的 NavigationView 时,SwiftUI onAppear 调用了两次
【发布时间】:2021-08-01 15:35:09
【问题描述】:

所以我有一个 TabView,其中每个选项卡都嵌入在 NavigationView 中。 在每个选项卡第一次出现时,我得到以下生命周期调用 onAppear()、onDisappear()、onAppear()。所以看起来 onAppear 被调用了两次。这只是第一次发生。如果我导航回同一个选项卡,则只会调用 onAppear(),而且只会调用一次。

这是一个最小的例子:

struct Page1: View {
    init() { print("Page 1 init") }
    
    var body: some View {
        NavigationView {
            Text("Page 1")
                .onAppear(perform: { print("Page 1 appearing") })
                .onDisappear(perform: { print("Page 1 disappearing") })
        }
    }
}

struct Page2: View {
    init() { print("Page 2 init") }
    
    var body: some View {
        NavigationView {
            Text("Page 2")
                .onAppear(perform: { print("Page 2 appearing") })
                .onDisappear(perform: { print("Page 2 disappearing") })
        }
    }
}

struct ContentView: View {
    var body: some View {
        TabView {
            Page1().tabItem { Text("Page 1") }
            Page2().tabItem { Text("Page 2") }
        }
    }
}

这是打印出来的结果:

Page 1 init
Page 2 init
Page 1 appearing
Page 1 disappearing
Page 1 appearing

如果我点击第二个标签会发生以下情况

Page 1 init
Page 2 init
Page 1 appearing
Page 1 disappearing
Page 1 appearing
// here I clicked on second tab
Page 2 appearing
Page 2 disappearing
Page 2 appearing
Page 1 disappearing

【问题讨论】:

  • 我看到了同样的行为:onAppear 被多次调用。我不知道为什么会这样,但我通过在视图中存储一个布尔值并在onAppear 中添加一个条件来解决它。所以,if needOnAppear { needOnAppear = false }

标签: swiftui navigationview tabview onappear


【解决方案1】:
    TabView {
        NavigationView {
            VStack {
                Color.red
                    .onAppear {
                        print("appear : red")
                    }
                    .onDisappear {
                        print("disappear : red")
                    }
            }.onAppear {
                print("appear")
            }
        }
    }

在 iOS 15 beta 模拟器上测试

输出:

appear : red
appear
disappear : red
appear : red

【讨论】:

  • 你在标签视图中有一个标签。当您在两个选项卡之间切换时会出现问题
猜你喜欢
  • 2021-03-28
  • 2020-11-14
  • 1970-01-01
  • 2020-06-18
  • 2020-11-24
  • 2020-10-28
  • 1970-01-01
  • 2020-03-22
  • 2021-12-13
相关资源
最近更新 更多