Refre sh данных во вкладках TabView - PullRequest
0 голосов
/ 11 марта 2020

Я недавно начал с SwiftUI, и это доставляет мне неприятности. Я застрял в части, где мне нужно обновить sh данных, в частности View, прикрепленных к TabView.

Объяснение: У меня есть 4 вкладки в приложении, и в одной вкладке вы можете искать продукт и нажмите сохранить и в другом вы можете проверить сохраненные продукты.

Я использую Realm для сохранения и сохранения работ! Почему? Потому что, если я обновлю sh приложение, я увижу мой продукт. Но проблема в том, что если я сохраню продукт, а затем нажму на вкладку «Сохранить», только что сохраненный продукт не будет отображаться .

Так что я не знаю, как я могу обновить sh данные в конкретной вкладке после инициализации вкладок. Это код 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 и ObservedObject

1 Ответ

0 голосов
/ 12 марта 2020

Вы можете использовать любую инфраструктуру базы данных, важный способ использования инфраструктуры SwiftUI и Combine - в ObservableObject, и как работает @EnvironmentObject.

1) Создайте свой ObservableObject

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

увидит, что @Published, он сообщит всем слушателям, если этот список будет обновлен.

2) Добавьте @EnvironmentObject в ваш TabView

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

После этого вы можете комбинировать его с любой платформой базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...