Slide 18
Slide 18 text
Automatically deallocate coordinators
open class NavigationCoordinator: NSObject, Coordinator, UINavigationControllerDelegate {
weak var parentCoordinator: NavigationCoordinator?
var rootViewController: UIViewController
var navigationController: UINavigationController
var childCoordinators: [Coordinator]
var childViewControllers: [WeakRef]
init(rootViewController: UIViewController, navigationController: UINavigationController) {
self.childCoordinators = []
self.childViewControllers = []
self.rootViewController = rootViewController
self.navigationController = navigationController
super.init()
}
...
public func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
guard let toViewController = navigationController.transitionCoordinator?.viewController(forKey: .to) else { return }
removeIfNeeded(coordinator: self, toViewController: toViewController)
}
private func contains(coordinator: NavigationCoordinator, viewController: UIViewController) -> Bool {
return coordinator.childViewControllers.contains(where: { $0.value === viewController })
}
func removeIfNeeded(coordinator: NavigationCoordinator, toViewController: UIViewController) {
if contains(coordinator: coordinator, viewController: toViewController) {
return
}
else if let parentCoordinator = coordinator.parentCoordinator {
parentCoordinator.remove(coordinator: coordinator)
parentCoordinator.set(delegate: parentCoordinator)
removeIfNeededcoordinator: parentCoordinator, toViewController: toViewController)