Вот мой код в SingleMovieView
, он покажет некоторый список mov ie, один из них - RecMovieList
. И когда пользователь нажимает одно из изображений mov ie в RecMovieList
, затем запускает onTapGesture
для перезагрузки данных в модели, которая включает в себя опубликованное свойство, это работает. Но я могу назначить модель на RecMovieList
. Но я не думаю, что это подходящий подход.
Поэтому я хочу изменить его на что-то вроде этого:
удаление назначения свойства модели для структуры RecMovieList
. Теперь это выглядит как RecMovieList(movies:
model.movieDetailBundle[.Recomm] as! [MovieViewModel])
.
В 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)
}
}