ios - 为什么在 SwiftUI 的 TabView 中切换选项卡时 onDisappear 之后再次调用 onAppear?

标签 ios swiftui tabview

如果有任何更改,我会在出现选项卡项时调用 API。为什么在调用onDisappear 之后调用onAppear?
这是一个简单的例子:

struct ContentView: View {
    var body: some View {
        TabView {
            NavigationView {
                Text("Home")
                    .navigationTitle("Home")
                    .onAppear {
                        print("Home appeared")
                    }
                    .onDisappear {
                        print("Home disappeared")
                    }
            }
            .tabItem {
                Image(systemName: "house")
                Text("Home")
            }.tag(0)
        
            NavigationView {
                Text("Account")
                    .navigationTitle("Account")
                    .onAppear {
                        print("Account appeared")
                    }
                    .onDisappear {
                        print("Account disappeared")
                    }
            }
            .tabItem {
                Image(systemName: "gear")
                Text("Account")
            }.tag(1)
        }
    }
}    
只需运行上面的代码,我们将在 onDisappear 之后看到 onAppear。
Home appeared
---After switch tab to Account---
Home disappeared
Account appeared
Home appeared
有什么办法可以避免这种情况吗?

最佳答案

这是非常烦人的错误,想象一下这种情况:Home查看 onAppear方法包含一个重复获取数据的计时器。
通过切换到 Account 来无形地触发计时器看法。
解决方法:

  • 为每个嵌入式 NavigationView 创建一个独立 View 内容
  • 将当前选择值作为 @Binding 传递到独立 View 参数

  • 例如。:
    struct ContentView: View {
        @State var selected: MenuItem = .HOME
    
        var body: some View {
            return TabView(selection: $selected) {
                HomeView(selectedMenuItem: $selected)
                    .navigationViewStyle(StackNavigationViewStyle())
                    .tabItem {
                        VStack {
                            Image(systemName: "house")
                            Text("Home")
                        }
                    }
                    .tag(MenuItem.HOME)
                
                AccountView(selectedMenuItem: $selected)
                    .navigationViewStyle(StackNavigationViewStyle())
                    .tabItem {
                        VStack {
                            Image(systemName: "gear")
                            Text("Account")
                        }
                    }
                    .tag(MenuItem.ACCOUNT)
            }
        }
    }
    
    enum MenuItem: Int, Codable {
        case HOME
        case ACCOUNT
    }
    
    主页 View :
    struct HomeView: View {
    
        @Binding var selectedMenuItem: MenuItem
    
        var body: some View {
            return Text("Home")
                .onAppear(perform: {
                    if MenuItem.HOME == selectedMenuItem {
                        print("-> HomeView")
                    }
                })
        }
    }
    
    帐户 View :
    struct AccountView: View {
    
        @Binding var selectedMenuItem: MenuItem
    
        var body: some View {
            return Text("Account")
                .onAppear(perform: {
                    if MenuItem.ACCOUNT == selectedMenuItem {
                        print("-> AccountView")
                    }
                })
        }
    }
    

    关于ios - 为什么在 SwiftUI 的 TabView 中切换选项卡时 onDisappear 之后再次调用 onAppear?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63252499/

    相关文章:

    swift - 实例成员 '$isBrowsingWebsite' 不能用于类型 'MapPinSheetSectionOneView_Previews'

    ios - 如何在 SwiftUI 中按日期对核心数据项进行分组?

    yui3 - 如何使用javascript更改YUI3选项卡

    qt - 在 QML 中的 TabView 内调用另一个 QML 文件中的函数或属性

    ios - 标签栏( View Controller )中调用多次ios的通知中心方法方法?如何删除观察者?

    ios - Xcode 自动为文件名添加前缀

    ios - iOS 中没有磁贴的弹出窗口

    ios - 关于多平台库的基本 Swift 包管理器问题

    alignment - 如何在 SwiftUI 中对齐文本和图像的顶部

    react-native - 我尝试了 React Native Tab View。路由导航在 renderScene 组件中不起作用