如何在初始化过程中将一个属性与另一个属性一起初始化-SwiftUI

时间:2020-06-28 19:00:05

标签: ios swift xcode swiftui

我正在构建一个应用,该应用从The Movie Database API中获取数据并按流派显示电影列表。

在我的视图模型中,我有一个调用api并通过可观察对象使数据可用的函数。

import Foundation

class MovieListViewModel: ObservableObject {
    
    @Published var movies = [Movie]()
    
    private var fetchedMovies = [MovieList]()
    
    var page = 1
    
    func fetchMovies(genre: Int) {
        
        WebService().getMoviesByGenre(genre: genre, page: page) { movie in
            
            if let movie = movie {
                
                self.fetchedMovies.append(movie)
                
                for movie in movie.movies {
                    
                  
                        self.movies.append(movie)
                
                }
            }
        }
        page += 1
        print(page)
    }
}

在视图内部,我使用onAppear调用该函数并传递从上一个视图接收的流派ID(Int)。这一切都按预期工作。

import SwiftUI

struct MovielistView: View {
    
    @ObservedObject private var movielistVM = MovieListViewModel()
    
    var genre: GenreElement
    
    var body: some View {
        
        List {
            
            ...
            
            }
            
        }.onAppear {
            self.movielistVM.fetchMovies(genre: self.genre.id)
            
        }
        .navigationBarTitle(genre.name)
    }
}

问题是因为我使用的是onAppear,因此每次用户导航回到该视图时,api都会被命中/视图将刷新。

理想情况下,我想在视图模型初始化期间调用一次api,但是由于genre属性尚未初始化,因此无法将参数传递给视图模型。

我已经尝试过(如下),但是在初始化所有存储的属性之前得到错误'self'

import SwiftUI

struct MovielistView: View {
    
    @ObservedObject private var movielistVM = MovieListViewModel()
    
    var genre: GenreElement
    
    init() {
        movielistVM.fetchMovies(genre: genre.id) // Error here
    }
    
    var body: some View {
        
        List {
            
            ...
            
        }
        .navigationBarTitle(genre.name)
    }
}

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

genre添加一个init参数,并在使用之前初始化genre的{​​{1}}属性:

MovielistView