In the project I made with Viper, the presenter in ViewController gives a nil error. What is the reason of this? And how can I solve this problem?
AppDelegate
let wireframe = MovieWireframe()
let movies = wireframe.createMovieController()
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = UINavigationController(rootViewController: movies)
window?.makeKeyAndVisible()
ViewController
Presenter here gives a nil error.
var presenter: IMoviePresenter? //Nil
override func viewDidLoad() {
super.viewDidLoad()
presenter?.startFetchingMovies() //Nil
}
Presenter
StartFetchingMovies here doesn't work because presenter is nil.
class MoviePresenter: IMoviePresenter {
var view: IMovieView?
var interactor: IMovieInteractor
var router: IMovieWireframe
var movies: MoviesResult?
init(view: IMovieView?, interactor: IMovieInteractor, router: IMovieWireframe) {
self.view = view
self.interactor = interactor
self.router = router
}
func startFetchingMovies() {
interactor.fetchMovies()
}
func showMovieController(navigationController: UINavigationController) {
router.pushToMovieDetailScreen(navigationController: navigationController)
}
}
extension MoviePresenter: IMovieInteractorDelegate {
func movieInteractorDidSuccessToFetchMovies(movies: MoviesResult) {
self.movies = movies
view?.showMovie(movies: movies)
}
func movieInteractorDidFailToFetchMovies() {
print("error")
}
}
Router
View.presenter here is not nil.
class MovieWireframe: IMovieWireframe {
func createMovieController() -> UIViewController {
print("createMovieController")
let view = MovieVC()
let movieService = APIClient()
let interactor = MovieInteractor(movieService: movieService)
let presenter = MoviePresenter(
view: view,
interactor: interactor,
router: self
)
view.presenter = presenter
print("presenter: \(presenter)")
interactor.delegate = presenter
return view
}
func pushToMovieDetailScreen(navigationController: UINavigationController) {
}
}