我最近从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)
函数刷新数据(从Realm
:historiesViewModel.getHistories()
重新获取数据),但由于onAppear
,应用崩溃。
我正在使用NSinternalInconsistencyException
和ObservableObject
答案 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 {
...
}
在这里您看到SearchListView
和SavedListView
各自都有自己的@EnvironmentObject
。
我们是否需要将userData
中的ContentView
对象发送给他们?答案是否定的。
@EnvironmentObject
的工作方式是通过引用其中声明相同的@EnvironmentObject
的子视图自动传递的。
ContentView.userData == SearchListView.userData == SavedListView.userData
因为
ContentView.userData
|
TabView
| \
SearchListView SavedListView
5)更新UserData
我们现在需要的是从savedList
更新userData
中的SearchListView
,SavedListView
将自动更新。
ForEach(userData.searchList) { item in
ListView(item: item)
.onTapGesture {
self.userData.savedList.append(item)
}
我建议您按照Apple的本教程来熟悉SwiftUI和Combine
之后,您可以将其与所需的任何数据库框架组合。