首页 > 解决方案 > 为什么我的观点没有从一个场景通过条件,但从其他 2 个场景来看它有效

问题描述

我正在使用此视图从 API 获取详细的电影,然后显示它...该视图在所有场景中都可以正常工作,但我正在使用搜索状态,该视图将无法通过 if 条件,但打印语句向我显示了选项不是零..

struct MovieDetailView: View {

@EnvironmentObject var state: GenreListState

@ObservedObject private var movieDetailState = MovieDetailState()

let movieId: Int

var body: some View {
    VStack {
        if movieDetailState.movie != nil && state.genres != nil {
            MovieDetailListView(movie: self.movieDetailState.movie!, genres: state.genres!)
        } 
        Text("Here")
            .onAppear() {
                DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                print(self.movieDetailState.movie ?? "no movie")
                print(self.state.genres ?? "no genres")
                }
            }
    }
    .navigationBarTitle(movieDetailState.movie?.title ?? "")
    .onAppear {
        self.movieDetailState.loadMovie(id: self.movieId)
        self.state.loadGenres()
    }
}

我正在通过这个视图访问它,该视图已经填充了 Movie 数组,因此 movieId 始终有效并且获取详细电影的成功

struct MoviePosterView: View {

let movies: [Movie]

var body: some View {
    ScrollView() {
        ForEach(self.movies) { movie in
            NavigationLink(destination: MovieDetailView(movieId: movie.id)) {
                MoviePosterCard(movie: movie)
            }.buttonStyle(PlainButtonStyle())
            .padding(EdgeInsets(top: 0, leading: 0, bottom: 10, trailing: 0))
        }
    }
    .padding(EdgeInsets(top: 10, leading: 20, bottom: 0, trailing: 20))
}

电影列表状态

class MovieDetailState: ObservableObject {

private let movieService: NetworkingService
@Published var movie: Movie?
@Published var movies = [Movie]()
@Published var isLoading = false
@Published var error: NSError?

init(movieService: NetworkingService = NetworkingApi.shared) {
    self.movieService = movieService
}

func loadMovie(id: Int) {
    self.movie = nil
    self.isLoading = true
    self.movieService.fetchMovie(id: id) {[weak self] (result) in
        guard let self = self else { return }
        
        self.isLoading = false
        switch result {
        case .success(let movie):
            self.movie = movie
        case .failure(let error):
            self.error = error as NSError
        }
    }
}

func appendMovie(id: Int) {
    self.isLoading = false
    self.movieService.fetchMovie(id: id) {[weak self] (result) in
        guard let self = self else { return }
        
        self.isLoading = false
        switch result {
        case .success(let movie):
            self.movies.append(movie)
        case .failure(let error):
            self.error = error as NSError
        }
    }
}

流派列表状态

class GenreListState: ObservableObject {

@Published var genres: [Genres]?
@Published var isLoading: Bool = false
@Published var error: NSError?

private let genreService: NetworkingService

init(genreService: NetworkingService = NetworkingApi.shared) {
    self.genreService = genreService
}

func loadGenres() {
    self.genres = nil
    self.isLoading = true
    self.genreService.getGenreList { [weak self] (result) in
        guard let self = self else { return }
        self.isLoading = false
        switch result {
        case .success(let response):
            self.genres = response.genres
        case .failure(let error):
            self.error = error as NSError
        }
    }
}

标签: swiftswiftuiios14swiftui-navigationlink

解决方案


推荐阅读