首页 > 解决方案 > 如何在兄弟视图之间传递环境对象?

问题描述

我正在尝试在兄弟视图之间传递一些数据。

我有VerseDetailView一个按钮:

@StateObject var favoritesViewModel = FavoritesViewModel()
...
Button("Add to favorite") {
 favoritesViewModel.add(verse: verse)
}

我的FavoritesViewModel样子是这样的:

class FavoritesViewModel: ObservableObject {
    
    @Published var favoriteVerses: [Verse] = []
    
    func add(verse: Verse) {
        favoriteVerses.append(verse)
    }
    
}

我将如何传递favoriteVerses以显示在完全不同的子视图中?

我的主应用程序文件如下所示:

var body: some Scene {
        WindowGroup {
            TabView {
                NavigationView {
                    BookView() // VerseDetailView is a child of this view
                }
                .tabItem {
                    Image(systemName: "book")
                    Text("Books")
                       
                }
                NavigationView {
                    FavoritesView() // I want to get the array of favoriteVerses here
                }
                
                .tabItem {
                    Image(systemName: "bookmark")
                    Text("Favorites")
                }
            }
        }
    }

我的FavoritesView样子是这样的:

struct FavoritesView: View {
    @EnvironmentObject var favoritesViewModel: FavoritesViewModel 
     // is this correct?
    // I get a hread 1: "Fatal error: No ObservableObject of type FavoritesViewModel found" error
    
    var body: some View {
        
            List {
                Section(header: Text("Favorite verses")) {
                    ForEach(favoritesViewModel.favoriteVerses) { verse in
                        Text(verse.verse)
                    }
                }
                
            }
    }
    
}

我尝试在主应用程序文件的顶部添加它:

var favoritesViewModel = FavoritesViewModel()
...
NavigationView { 
  FavoritesView().environmentObject(favoritesViewModel)
}

但这也不起作用

标签: swiftswiftuiswiftui-environment

解决方案


将其添加为常见的顶视图(在您的情况下是TabView),例如

TabView {
    NavigationView {
        BookView() // VerseDetailView is a child of this view
    }
    .tabItem {
        Image(systemName: "book")
        Text("Books")
           
    }
    NavigationView {
        FavoritesView() // I want to get the array of favoriteVerses here
    }
    
    .tabItem {
        Image(systemName: "bookmark")
        Text("Favorites")
    }
}
.environmentObject(favoritesViewModel)   // << here !!

推荐阅读