Краткое описание:
Я реализовал Соруша Координаторы архитектура.Все отлично работает, кроме удаления части, которая необходима для удаления предыдущих (дочерних) координаторов.
Сценарий:
У меня есть два ViewController
с именами HomeViewController
и MyGroupsViewController
.Каждый из них имеет свой собственный координатор с именами HomeCoordinator
и MyGroupsCoordinator
соответственно.
Пользователь нажимает кнопку на HomeViewController
, которая вызывает функцию gotoMyGroupsTapped
и переводит пользователя на MyGroupsViewController
, затем пользователь нажимает на другуюкнопка на MyGroupsViewController
, которая возвращает пользователя к HomeViewController
, вызывая gotoHomePage()
.
Довольно просто!: HomeVC -> MyGroupsVC -> HomeVC
Но проблема в том, что
navigationController.transitionCoordinator?
равно ноль в func navigationController(..., didShow viewController: UIViewController...)
воба координатора и я не можем удалить дочерние координаторы при каждом переходе.
Правильно ли установить navigationController.delegate = self
в start()
func обоих координаторов?
Должен ли я использовать navigationController?.popViewController(animated: false )
в моемbackToHomePage()
func?потому что Пол Хадсон использовал только pushViewController
.
Мои коды [Упрощенные версии]:
HomeCoordinator.swift
import Foundation
import UIKit
class HomeCoordinator: NSObject,Coordinator,UINavigationControllerDelegate {
var childCoordinators = [Coordinator]()
var navigationController: UINavigationController
weak var parentCoordinator : Coordinator?
init(navigationController: UINavigationController) {
self.navigationController = navigationController
}
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
// Transition here is nil
print(" Transition : ",navigationController.transitionCoordinator)
guard let fromViewController = navigationController.transitionCoordinator?.viewController(forKey: .from) else {
print("Unknown fromViewController!")
return
}
// Removing a child coordinator
}
func gotoMyGroups (){
let groupsCoordinator = GroupsCoordinator(navigationController: navigationController)
childCoordinators.append(groupsCoordinator)
groupsCoordinator.parentCoordinator = self
groupsCoordinator.start()
}
func start() {
let vc = HomeViewController.instantiate()
vc.coordinator = self
navigationController.delegate = self
navigationController.pushViewController(vc, animated: false)
navigationController.setNavigationBarHidden(true, animated: false)
}
}
MyGroupsCoordinator.swift
import Foundation
import UIKit
class MyGroupsCoordinator: NSObject,Coordinator,UINavigationControllerDelegate {
var childCoordinators = [Coordinator]()
var navigationController: UINavigationController
weak var parentCoordinator : Coordinator?
init(navigationController: UINavigationController) {
self.navigationController = navigationController
}
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
// Transition here is nil
print(" Transition : ",navigationController.transitionCoordinator)
guard let fromViewController = navigationController.transitionCoordinator?.viewController(forKey: .from) else {
print("Unknown fromViewController!")
return
}
// Removing a child coordinator
}
func start() {
let vc = MyGroupViewController.instantiate()
vc.coordinator = self
navigationController.delegate = self
navigationController.pushViewController(vc, animated: false)
navigationController.setNavigationBarHidden(true, animated: false)
}
}
MyGroupViewController.magik
class MyGroupViewController : UIViewControllerWithCoordinator,UITextFieldDelegate,Storyboarded{
@IBAction func gotoHomePage(_ sender: Any) {
if let coord = coordinator as? GroupsCoordinator {
coord.parentCoordinator?.start()
}
}
}
HomeViewController.swift
class HomeViewController: UIViewControllerWithCoordinator,Storyboarded {
@IBAction func gotoMyGroupsTapped(_ sender: Any) {
guard let acoordinator = coordinator as? HomeCoordinator else {
return
}
acoordinator.gotoMyGroups()
}