我有一个TabBarCoordinator,它有两个选项卡:一个用于带有FirstTabCoordinator
的电影列表(MoviesListViewController
(,另一个用于带SecondTabCoordinator
的最喜欢的电影(FavoritesViewController
(,都有一个tableView,每个选项卡都有自己的navigationController
。当我点击电影时,在电影列表选项卡或收藏夹选项卡中,我会按下MovieDetailsViewController
。这很好用。但在MovieDetailsViewController中,我有另一个类似电影的集合。
我的问题是:
在MovieDetailsViewController中,当我在didSelectItemAt indexPath
上点击类似的电影时,我如何告诉哪个协调器推送下一个MovieDetails ViewController?因为我可以从两位协调员那里了解电影的细节。
我想我可能需要在这两位协调员之间添加某种机制,但我不确定。
这是我的主协调员
protocol Coordinator {
func startCoordinator()
}
class MainCoordinator: Coordinator {
var tabBarController = UITabBarController()
static func getCoordinator() -> MainCoordinator? {
if let scene = UIApplication.shared.connectedScenes.first, let delegate = scene.delegate as? SceneDelegate {
return delegate.coordinator
}
return nil
}
func startCoordinator() {
FirstTabCoordinator.shared.startCoordinator()
let moviesListVC = FirstTabCoordinator.shared.moviesListViewController
self.setupTabBarItem(vc: moviesListVC,
title: "All Movies",
imageName: "film",
selectedImageName: "film.fill")
SecondTabCoordinator.shared.startCoordinator()
let favoritesVC = SecondTabCoordinator.shared.favoritesViewController
self.setupTabBarItem(vc: favoritesVC,
title: "Favorites",
imageName: "heart",
selectedImageName: "heart.fill")
self.tabBarController.tabBar.barStyle = .black
self.tabBarController.tabBar.isTranslucent = false
self.tabBarController.tabBar.tintColor = .white
self.tabBarController.viewControllers = [FirstTabCoordinator.shared.navigationController,
SecondTabCoordinator.shared.navigationController]
}
func setupTabBarItem(vc: UIViewController, title: String, imageName: String, selectedImageName: String) {
let defaultImage = UIImage(systemName: imageName)
let selectedImage = UIImage(systemName: selectedImageName)
let tabBarItem = UITabBarItem(title: title, image: defaultImage, selectedImage: selectedImage)
vc.tabBarItem = tabBarItem
}
}
第一个选项卡协调器:
class FirstTabCoordinator: Coordinator {
var navigationController: UINavigationController! {
didSet {
navigationController?.navigationBar.tintColor = .white
navigationController?.navigationBar.barStyle = .black
}
}
let storyboard = UIStoryboard(name: "Main", bundle: .main)
private lazy var navigationManager = NavigationManager(self.navigationController)
static let shared = FirstTabCoordinator()
private init() {}
lazy var moviesListViewController: MoviesTableViewController = {
let viewController = self.storyboard.instantiateViewController(identifier: "MoviesTableViewController") as! MoviesTableViewController
viewController.title = "All Movies"
return viewController
}()
func startCoordinator() {
self.navigationController = UINavigationController()
self.navigationController.viewControllers = [self.moviesListViewController]
}
func goToMovieDetails(movie: Movie) {
self.navigationManager.goToMovieDetails(movie: movie)
}
}
第二选项卡协调员:
class SecondTabCoordinator: Coordinator {
var navigationController: UINavigationController! {
didSet {
navigationController?.navigationBar.tintColor = .white
navigationController?.navigationBar.barStyle = .black
}
}
let storyboard = UIStoryboard(name: "Main", bundle: .main)
private lazy var navigationManager = NavigationManager(self.navigationController)
static let shared = SecondTabCoordinator()
private init() {}
lazy var favoritesViewController: FavoritesViewController = {
let viewController = self.storyboard.instantiateViewController(identifier: "FavoritesViewController") as FavoritesViewController
viewController.title = "Favorites"
return viewController
}()
func goToMovieDetails(movie: Movie) {
self.navigationManager.goToMovieDetails(movie: movie)
}
func startCoordinator() {
self.navigationController = UINavigationController()
self.navigationController.viewControllers = [self.favoritesViewController]
}
}
您可以让协调器实现一个包含函数func goToMovieDetails(movie: Movie)
的协议,并在创建ViewController时传入它的实例,这样您就不在乎它是第一个还是第二个选项卡协调器