致命错误:未找到 SelectedTab 类型的 ObservableObject SelectedTab 的 View.environmentObject(_:) 可能缺少作为此视图的祖先 1.2.

问题描述

这里出现错误 - selectedTab = tab.getTab()

致命错误:未找到 SelectedTab 类型的 ObservableObject。 SelectedTab 的 View.environmentObject(_:) 可能缺少作为此视图的祖先。

也试过这个 - https://www.hackingwithswift.com/forums/swiftui/fatal-error-no-observableobject-of-type-order-found/3208

    class SelectedTab: ObservableObject {
        @Published var tab:String = "Home"
        
        func setTab(tabName: String) {
            tab = tabName
        }
        
        func getTab() -> String {
            return tab
        }
    }
    
    
    
    struct TabBarContentView: View {
        @EnvironmentObject var tab: SelectedTab
        
        var body: some View {
            Home().environmentObject(tab)
        }
    }
    
    struct TabBarContentView_Previews: PreviewProvider {
        
        
        static var previews: some View {
            Group {
                TabBarContentView()
                    .previewDevice(PreviewDevice(rawValue: "iPhone 12 Pro Max"))
                    .previewdisplayName("iPhone 12 Pro Max") 
            }
        }
    }
    
struct Home: View {
    @EnvironmentObject var tab: SelectedTab
    @State var selectedTab = "Home"

init() {
    UITabBar.appearance().isHidden = true
    selectedTab = tab.getTab()
}

var body: some View{
    NavigationView() {
        ZStack(alignment: .bottom,content: {
            
            TabView(selection: $selectedTab){
                HoMetab()
                NewsTab()
                ProfileTab()
                MoreTab()
            }
        }
        }
}

}

解决方法

你有:

struct Home: View {
@EnvironmentObject var tab: SelectedTab   // <--- here
....

和 TabBarContentView 类似。

这意味着您在父视图(例如应用程序)中有如下内容:

import SwiftUI

@main
struct MyApp: App {
    @StateObject var tab = SelectedTab()   // <--- here
    var body: some Scene {
        WindowGroup {
            Home().environmentObject(tab)  // <--- here
        }
    }
}  

如果你没有这样的东西,那么你就会看到你看到的错误。

,

Home 中,tab初始化期间不可用。

struct Home: View {
    @EnvironmentObject var tab: SelectedTab
    @State var selectedTab = "Home"
    
    init() {
        UITabBar.appearance().isHidden = true
        selectedTab = tab.getTab()  // tab is not available here.
    }

    ------
}


有两种方法可以解决此问题。

1.

更改家的签名。从selectedTab通过TabBarContentView

struct Home: View {
    @EnvironmentObject var tab: SelectedTab
    
    @State var selectedTab = "Home"
    
    init(selectedTab: String) {
        UITabBar.appearance().isHidden = true
        self.selectedTab = selectedTab
    }

    ---
 }
struct TabBarContentView: View {
    @EnvironmentObject var tab: SelectedTab
    
    var body: some View {
        Home(selectedTab: tab.getTab()).environmentObject(tab)
    }
}

2.

@ObservedObject 中使用 @EnvironmentObject 而不是 Home

struct Home: View {
    @ObservedObject var tab: SelectedTab
    
    @State var selectedTab = "Home"
    
    init(tab: SelectedTab) {
        UITabBar.appearance().isHidden = true
        self.tab = tab
        self.selectedTab = tab.getTab()
    }
}

struct TabBarContentView: View {
    @EnvironmentObject var tab: SelectedTab
    
    var body: some View {
        Home(tab: tab)
    }
}


如果您不需要 SelectedTab 用于任何其他目的,请选择第二种方法。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...