Как правильно перезагрузить данные текущего View в SwiftUI? - PullRequest
0 голосов
/ 12 апреля 2020

Вот мой код в SingleMovieView, он покажет некоторый список mov ie, один из них - RecMovieList. И когда пользователь нажимает одно из изображений mov ie в RecMovieList, затем запускает onTapGesture для перезагрузки данных в модели, которая включает в себя опубликованное свойство, это работает. Но я могу назначить модель на RecMovieList. Но я не думаю, что это подходящий подход.

Поэтому я хочу изменить его на что-то вроде этого:

  1. удаление назначения свойства модели для структуры RecMovieList. Теперь это выглядит как RecMovieList(movies: model.movieDetailBundle[.Recomm] as! [MovieViewModel]).

  2. В RecMovieList вместо этого объявите экземпляр модели var model = MovieListViewModel().

Ну, я думаю, что данные должны быть перезагружены в основной части, так как источник данных опубликованной модели был изменен, однако он не работает; данные не перезагружаются при нажатии. Я долго искал, но пока не нашел решения. Так чем же отличаются эти два способа или каков наилучший способ перезагрузить данные в текущем представлении?

/ / / Рабочий код перед изменением.

import SwiftUI
import KingfisherSwiftUI

struct SingleMovieView: View {

    var movieId: Int = -1

    @ObservedObject var model = MovieListViewModel()

    var body: some View {
        ScrollView(showsIndicators: false) {
            VStack(alignment: .leading)  {
                createPosterImage()
                MovieDetailView(movie: self.model.movie)

                if model.movieDetailBundle.isEmpty {
                    Text("Loading")
                }
                else {
                    VStack(alignment: .leading, spacing: 12) {
                        // CrewList(crews: (model.movieDetailBundle[.Crew] as! [CrewViewModel]).filter {$0.job == "Director"} )
                        // CastList(casts: model.movieDetailBundle[.Cast] as! [CastViewModel])
                        // ImageList(images: model.movieDetailBundle[.Images] as! [ImageViewModel])
                        RecMovieList(movies: model.movieDetailBundle[.Recomm] as! [MovieViewModel], model: self.model)
                    }
                }
            }
        }.edgesIgnoringSafeArea(.top)
        .onAppear() {
                self.model.getMovieDetail(id: self.movieId)
                self.model.getMovieDetailBundle(id: self.movieId)
        }
    }
    fileprivate func createPosterImage() -> some View {
        return KFImage(source: .network(model.movie.posterUrl))
            .resizable().aspectRatio(contentMode: .fit)
    }
}

// ...

struct RecMovieList: View {

    var movies: [MovieViewModel]
    var model: MovieListViewModel

    var body: some View {
        VStack(alignment: .leading) {
            Text("\(MovieDetailSection.Recomm.rawValue)")
                .font(.headline)
            ScrollView(.horizontal) {
                HStack(alignment: .top, spacing: 10) {
                    ForEach(movies) { movie in
                        VStack(alignment: .leading) {
                            KFImage(source: .network(movie.posterUrl))
                                .resizable()
                                .frame(width: 100, height: 150)
                                .aspectRatio(2/3, contentMode: .fill)
                                .onTapGesture {
                                    self.model.getMovieDetail(id: movie.id)
                                    self.model.getMovieDetailBundle(id: movie.id)
                                }
                            Text("\(movie.title)")
                            .lineLimit(2)
                            .foregroundColor(.gray)
                            .frame(height: 50, alignment: .top)

                        }.frame(width: 100)
                    }
                }
            }
        }
        .padding(.horizontal).padding(.bottom)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...