Swift 为什么我的视图不是从一个场景传递条件,而是从另外两个场景传递条件
我正在使用此视图从API获取详细的电影,然后显示它。。。 视图在所有场景中都可以正常工作,但我使用的是搜索状态。视图将无法通过if条件,但打印语句显示我的选项不是零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
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_EonAppear
atText(“…”)
只是调试的一部分,因此它通常不在那里。我们也看不到GenreListState
或MovieDetailState
-请尝试创建一个最小的示例。@George\E更新了帖子