TabBarController with Coordinators(MVVM-C)-在不同的选项卡中打开同一个View



我有一个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时传入它的实例,这样您就不在乎它是第一个还是第二个选项卡协调器

最新更新