Невозможно удалить дочерний координатор, так как значение параметра transitionCoordinator равно nil в методе делегирования navigationController. - PullRequest
0 голосов
/ 02 марта 2019

Краткое описание:

Я реализовал Соруша Координаторы архитектура.Все отлично работает, кроме удаления части, которая необходима для удаления предыдущих (дочерних) координаторов.

Сценарий:

У меня есть два 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()
     }
...