Swift 为什么我的视图不是从一个场景传递条件,而是从另外两个场景传递条件

Swift 为什么我的视图不是从一个场景传递条件,而是从另外两个场景传递条件,swift,swiftui,ios14,swiftui-navigationlink,Swift,Swiftui,Ios14,Swiftui Navigationlink,我正在使用此视图从API获取详细的电影,然后显示它。。。 视图在所有场景中都可以正常工作,但我使用的是搜索状态。视图将无法通过if条件,但打印语句显示我的选项不是零 struct MovieDetailView: View { @EnvironmentObject var state: GenreListState @ObservedObject private var movieDetailState = MovieDetailState() let movieId: Int var

我正在使用此视图从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()
    }
}
我通过这个视图访问它,这个视图已经充满了电影数组,因此movieId总是有效的,对于详细的电影,fetch是成功的

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
        }
    }
}
基因重组状态

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

在代码的第一部分中,出现了两个
onAppear
s。也许你想移动一些代码,使其仅在其中一个代码中,因为它们不是基于条件的?@George_E
onAppear
at
Text(“…”)
只是调试的一部分,因此它通常不在那里。我们也看不到
GenreListState
MovieDetailState
-请尝试创建一个最小的示例。@George\E更新了帖子