swift - 为什么我的观点没有从一个场景通过条件,但从其他 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
}
}
}
解决方案
推荐阅读
- sql - 如何在 Oracle DB 中使用 max(Date) 和 Distinct。我想在一天内最后插入数据
- oracle - 插入内部触发器不触发
- javascript - 使用 moment js 将分钟转换为天、小时和分钟
- html - 向右移动 gif 图像
- reactjs - 出现错误:反应中未定义函数
- php - Illuminate\Database\QueryException SQLSTATE[23000]:完整性约束违规:1048 列“f_name”不能为空
- python - 无法更新谷歌电子表格 api 中的对齐方式,未知名称“字段”,python,如何修复?
- c# - 我正在使用 WinForms C#,我想创建一个事件,在按住鼠标时执行我的命令,而不是重复点击
- wpf - 材料设计 wpf 图标按钮不停靠在右侧
- node.js - 容器无法运行时如何进入 Docker 映像文件系统