问题描述
这里出现错误 - selectedTab = tab.getTab()
致命错误:未找到 SelectedTab 类型的 ObservableObject。 SelectedTab 的 View.environmentObject(_:) 可能缺少作为此视图的祖先。
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
用于任何其他目的,请选择第二种方法。