Обновление EnvironmentObject подтолкнуло меня назад - PullRequest
1 голос
/ 31 марта 2020

У меня есть два представления ListView и DetailView

ListView:

@EnvironmentObject var userData: UserData

var body: some View {
        VStack {
            ForEach(userData.packs) { pack in
                if pack.added {
                    NavigationLink(destination: DetailView(packIndex: self.userData.packs.firstIndex(where: { $0.id == pack.id })!)) {
                        MyRowViewDoesntMatter(pack: pack)
                    }
                }
            }
        }
        .padding(.horizontal)
    }

DetailView:

@EnvironmentObject var userData: UserData
var packIndex: Int

VStack {
       List {
           VStack {
               .... some Vies ... doesn't matter
       .navigationBarItems(trailing:



      THE PROBLEM IS HERE (BELOW)

      Button(action: {
               self.userData.packs[self.packIndex].added.toggle()
      }) {
        Image(systemName: self.userData.packs[self.packIndex].added ? "plus.circle.fill" : "plus.circle")
      }
      ...

Проблема заключается в том, что я нажимаю кнопку в навигационных элементах BarItems в DetailView. Свойство «добавлено» в «@EnvironmentObject var userData: UserData» обновляется, и экран пользователя возвращается (в RowView). Я обнаружил, что проблема с EnvironmentObject, потому что данные обновляются и View пытается перерисовать (?), Поэтому он отталкивает меня назад?

Как это исправить? Я хочу остаться на экране DetailView после нажатия кнопки.

PS Мне нужно использовать тип EnvironmentObject, потому что когда я возвращаюсь go, мне нужно видеть результаты.

Спасибо большое много!

1 Ответ

1 голос
/ 01 апреля 2020

Здесь возможен подход (путем введения какого-то выбора). Поскольку NavigationView не позволяет удалить ссылку из стека (как идентификатор стековой навигации), вероятно, также стоит рассмотреть возможность применения отдельной модели представления для DetailView, которая будет применена в общем контейнере при окончательном редактировании sh.

Протестировано с Xcode 11.4 / iOS 13.4.

Некоторая репликация вашего кода, используемая для тестирования:

struct ListView: View {
    @EnvironmentObject var userData: PushBackUserData

    @State private var selectedPack: Pack? = nil
    var body: some View {
        NavigationView {
            VStack {
                ForEach(Array(userData.packs.enumerated()), id: \.element.id) { i, pack in
                    NavigationLink("Pack \(pack.id)", destination:
                        DetailView(pack: self.$selectedPack)
                            .onAppear {
                                self.selectedPack = pack
                            }
                            .onDisappear {
                                self.userData.packs[i].added = self.selectedPack?.added ?? false
                            }
                    ).isHidden(!pack.added)
                }
            }
            .padding(.horizontal)
        }
    }
}

struct DetailView: View {
    @Binding var pack: Pack?
    var body: some View {
        VStack {
               List {
                   VStack {
                    Text("Pack \(pack?.id ?? "<none>")")
                   }
                }
               .navigationBarItems(trailing:
                  Button(action: {
                       self.pack?.added.toggle()
                  }) {
                    Image(systemName: pack?.added ?? false ? "plus.circle.fill" : "plus.circle")
                  }
                )
            }
    }
}

просто удобное вспомогательное расширение

extension View {
    func isHidden(_ hidden: Bool) -> some View {
        Group {
            if hidden { self.hidden() }
            else { self }
        }
    }
}
...