SwiftUI: .sheet () не go к предыдущему представлению с ожидаемыми данными при отклонении текущего листа - PullRequest
1 голос
/ 11 апреля 2020

Как минимум, мой код, как показано ниже. В SinglePersonView Когда пользователь нажимает одно изображение mov ie в MovieListView (список mov ie, показывающий фильмы с участием актера), он открывает SingleMovieView как режим листа.

Лист может быть выскочил как постукивание. Но я обнаружил, что после закрытия листа и повторного выбора других mov ie в MovieListView лист всегда открывается, как моя предыдущая информация о mov ie или первый выбранный раз. И я мог видеть в консоли, movie id всегда тот же самый, что и в первый раз. Теперь я не понимаю, нужна ли мне какая-то операция по перезагрузке при увольнении или что-то еще?

И это правильный способ использования .sheet() в subView в SwiftUI, или его всегда следует хранить в основном теле? , SinglePersonView в данном случае.

struct SinglePersonView: View {
  var personId = -1
  @ObservedObject var model = MovieListViewModel()

  var body: some View {
    ScrollView() {
      VStack() {
        ...
        MovieListView(movies: model.movies)
        ...
      }
    }.onAppear {
      // json API request
    }
  }
}

struct MovieListView: View {
  var movies: [PersonMovieViewModel]
  @State private var showSheet = false

  ScrollView() {
    HStack() {
      ForEach(movies) { movie in
        VStack() {
          Image(...)
          .onTapGesture {
              self.showSheet.toggle()
          }
          .sheet(isPresented: self.$showSheet) {
              SingleMovieView(movieId: movie.id)
          }
        }
      }
    }
  }
}


1 Ответ

0 голосов
/ 11 апреля 2020

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

Вот исправленный вариант

struct MovieListView: View {
    var movies: [PersonMovieViewModel]
    @State private var showSheet = false
    @State private var selectedID = ""         // type of your movie's ID

    var body: some View {
        ScrollView() {
            HStack() {
                ForEach(movies) { movie in
                    VStack() {
                        Image(...)
                            .onTapGesture {
                                self.selectedID = movie.id
                                self.showSheet.toggle()
                        }
                    }
                }
            }
            .sheet(isPresented: $showSheet) {
                SingleMovieView(movieId: selectedID)
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...