Мое приложение - приложение mov ie. Существует SingleMovieView
для представления информации, относящейся к одному mov ie, например, Director, Cast ... И внизу это вид прокрутки, чтобы показать список похожих фильмов. Когда пользователь щелкает один из его элементов, затем следует перейти к выбранному представлению mov ie.
Ну, проблема в том, что на самом деле это то же самое SingleMovieView
для пункта назначения. Или сказать, что я хочу повторно использовать это представление с другими данными для выбранного mov ie. В настоящее время я использую навигационную ссылку в ForEach RecMovieList
, и запись не работает. Итак, как сделать самовывоз для того же View в SwiftUI?
Вот код:
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.secSectionMoviesBundle.isEmpty {
Text("Loading")
} else {
VStack(alignment: .leading, spacing: 12) {
CrewList(crews: (model.secSectionMoviesBundle[.Crew] as! [CrewViewModel]).filter {$0.job == "Director"} )
CastList(casts: model.secSectionMoviesBundle[.Cast] as! [CastViewModel])
ImageList(images: model.secSectionMoviesBundle[.Images] as! [ImageViewModel])
RecMovieList(movies: model.secSectionMoviesBundle[.Recomm] as! [MovieViewModel])
}
}
}
}.edgesIgnoringSafeArea(.top)
.onAppear() {
self.model.getMovieDetail(id: self.movieId)
self.model.getSecSectionMoviesBundle(id: self.movieId)
}
}
// struct CrewList
// struct CastList
// struct ImageList
struct RecMovieList: View {
var movies: [MovieViewModel]
var body: some View {
VStack(alignment: .leading) {
Text("\(SecHomeSection.Recomm.rawValue)")
.font(.headline)
ScrollView(.horizontal) {
HStack(alignment: .top, spacing: 10) {
ForEach(0..<movies.count) { i in
VStack(alignment: .leading) {
NavigationLink(destination: SingleMovieView(movieId: self.movies[i].id)) {
KFImage(source: .network(self.movies[i].posterUrl))
.renderingMode(.original)
.resizable()
.frame(width: 100, height: 150)
.aspectRatio(2/3, contentMode: .fill)
}
Text("\(self.movies[i].title)")
.lineLimit(2)
.foregroundColor(.gray)
.frame(height: 50, alignment: .top)
}.frame(width: 100)
}
}
}
//.frame(height: 100)
}
.padding(.horizontal).padding(.bottom)
}
}
fileprivate func createPosterImage() -> some View {
return KFImage(source: .network(model.movie.posterUrl))
.resizable().aspectRatio(contentMode: .fit)
}
}
// Обновление: , как комментарий, я понимаю, что это перезагрузка данных текущего представления вместо навигации. Поэтому я добавляю ObservedObject в структуру RecMovieList, и теперь опубликованную модель можно использовать и в этой структуре, чтобы повторить сетевой запрос в onAppear ().
И я изменяю NavigationLink на Button, так как нет навигации необходимо. Ну, это работает, и представление может перезагрузиться, , но когда я касаюсь списка mov ie в приложении, оно вызывает событие касания / перезагрузки данных, даже для перетаскивания, прокрутки. Как я могу исправить эта вещь? Использовать TapGesture?
struct RecMovieList: View {
var movies: [MovieViewModel]
@ObservedObject var model = MovieListViewModel()
var body: some View {
VStack(alignment: .leading) {
Text("\(SecHomeSection.Recomm.rawValue)")
.font(.headline)
ScrollView(.horizontal) {
HStack(alignment: .top, spacing: 10) {
ForEach(0..<movies.count) { i in
VStack(alignment: .leading) {
Button(action: {
self.model.getMovieDetail(id: self.movies[i].id)
self.model.getSecSectionMoviesBundle(id: self.movies[i].id)
}) {
KFImage(source: .network(self.movies[i].posterUrl))
.renderingMode(.original)
.resizable()
.frame(width: 100, height: 150)
.aspectRatio(2/3, contentMode: .fill)
}
Text("\(self.movies[i].title)")
.lineLimit(2)
.foregroundColor(.gray)
.frame(height: 50, alignment: .top)
}.frame(width: 100)
}
}
}
//.frame(height: 100)
}
.padding(.horizontal).padding(.bottom)
}
}