Как перезагрузить данные текущего представления в подструктуре - PullRequest
1 голос
/ 07 апреля 2020

Мое приложение - приложение mov ie. Существует SingleMovieView для представления информации, относящейся к одному mov ie, например, Director, Cast ... И внизу это вид прокрутки, чтобы показать список похожих фильмов. Когда пользователь щелкает один из его элементов, затем следует перейти к выбранному представлению mov ie.

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

enter image description here

Вот код:

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)
        }
    }

1 Ответ

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

Попробуйте покрыть navigationLink () {} с помощью NavigationView {}

NavigationView {
  NavigationLink(destination: DestinationView()) { // code }
}

Если это не поможет, попробуйте также покрыть все "тело"

 var body: some View { 
    NavigationView {
    //code
    }   
 }

ОБНОВЛЕНИЕ:

Попробуйте использовать отличающийся от стиля кнопки по умолчанию для вас изображение кнопки рекомендации

ответ

.buttonStyle(BorderlessButtonStyle())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...