刷新TabView选项卡中的数据

时间:2020-03-11 19:41:54

标签: ios swift xcode swiftui

我最近从SwiftUI开始,这给我带来了麻烦。我陷入了需要刷新特别是附加到View的{​​{1}}数据的地方。

说明:我在应用程序中有4个标签,在一个标签中,您可以搜索产品并单击保存,在另一个标签中,您可以检查已保存的产品。

我正在使用TabView进行保存和保存作品!为什么?因为如果我刷新应用程序,将会看到我的产品。但是问题是:如果我保存产品,然后单击“保存”选项卡,则不会显示我刚刚保存的产品

所以我不知道初始化标签后如何刷新特定标签中的数据。这是Realm的代码:

TabView

我尝试使用 TabView { NoSavedView() .tabItem{ Image("scanBottom") Text("Scan") .foregroundColor(ColorsStatic.redish) .font(.custom("Poppins-Medium", size: 12)) }.tag(0) NoSearchView() .tabItem{ Image("searchBottom") Text("Search") .font(.custom("Poppins-Medium", size: 12)) .foregroundColor(ColorsStatic.white) }.tag(1) NoHistoryView() .tabItem{ Image("historyBottom") Text("History") .font(.custom("Poppins-Medium", size: 12)) .foregroundColor(ColorsStatic.white) }.tag(2) NoSavedView() .tabItem{ Image("savedBottom") Text("Saved") .font(.custom("Poppins-Medium", size: 12)) .foregroundColor(ColorsStatic.white) }.tag(3) }.edgesIgnoringSafeArea(.top) 函数刷新数据(从RealmhistoriesViewModel.getHistories()重新获取数据),但由于onAppear,应用崩溃。

我正在使用NSinternalInconsistencyExceptionObservableObject

1 个答案:

答案 0 :(得分:0)

您可以使用任何数据库框架,使用SwiftUI和Combine框架的重要方法在ObservableObject中,以及@EnvironmentObject的工作方式。

1)建立您的ObservableObject

class UserData: ObservableObject {
    @Published searchList: [SearchItemModel] = []
    @Published savedList: [SearchItemModel] = []
}

看到@Published,它将在此列表更新时通知所有侦听器。

2)在您的TabView中添加@EnvironmentObject

struct ContentView: View {
@EnvironmentObject var userData: UserData

var body: some View {
    TabView {
...
}

在这里,我将视图命名为ContentView,即其中包含TabView的视图。

3)填充UserData

let contentView = ContentView().environmentObject(UserData())

4)创建搜索列表视图并保存列表视图

struct SearchListView: View {
@EnvironmentObject var userData: UserData

var body: some View {
    List {
...
}

struct SavedListView: View {
@EnvironmentObject var userData: UserData

var body: some View {
    List {
...
}

在这里您看到SearchListViewSavedListView各自都有自己的@EnvironmentObject

我们是否需要将userData中的ContentView对象发送给他们?答案是否定的。

@EnvironmentObject的工作方式是通过引用其中声明相同的@EnvironmentObject的子视图自动传递的。

ContentView.userData == SearchListView.userData == SavedListView.userData

因为

ContentView.userData
|
TabView
|                \
SearchListView   SavedListView

5)更新UserData

中的列表

我们现在需要的是从savedList更新userData中的SearchListViewSavedListView将自动更新。

ForEach(userData.searchList) { item in
            ListView(item: item)
                .onTapGesture {
                    self.userData.savedList.append(item)
                }

我建议您按照Apple的本教程来熟悉SwiftUI和Combine

之后,您可以将其与所需的任何数据库框架组合。