Координатор выхода в шаблоне Coodinator в swift

#swift #uikit

Вопрос:

я новичок в шаблоне координатора, поэтому пытаюсь создать простой экран входа в систему

Загрузить приложение -> Экран входа в систему ->> Главный экран

я прочитал статью о взломе с помощью Swift о шаблоне координатора и все еще немного путаюсь в том, как выйти из координатора.

Итак, как мне выйти из координатора? Из того, что я знаю , родительский координатор состоит из Координатора входа в систему и Координатора главного экрана, чтобы получить доступ к Координатору Главного экрана, вам нужно очистить дочернего координатора в родительском координаторе, а затем добавить Координатора главного экрана. правильно ли это?

Поэтому в основном то, что я хочу сделать, это вернуться к родительскому координатору, а затем заранее настроить координатор Min View в качестве дочернего родительского координатора.

Родительский координатор :

 class AppCoordinator:NSObject,CoordinatorExtras {

    
    private(set) var childCoordinators = [Coordinator]()
    private let window:UIWindow
    init(win:UIWindow){
        self.window = win
    }
    func start() {
        let navigationControler = UINavigationController()
        
        let loginCoordinator = LoginCoordinator(navigationController: navigationControler)
        childCoordinators.append(loginCoordinator)
        loginCoordinator.parentCoordinator = self
        loginCoordinator.start()
        
        
        navigationControler.navigationBar.barStyle = .blackTranslucent
        
        window.rootViewController = navigationControler
        window.makeKeyAndVisible()
    }
    
    func userIsValid(_ child:Coordinator?) {
        childDidFinnish(child)
        let navigationControler = UINavigationController()
        let tabBarCoordinator = TabBarCoordinator(navigationController: navigationControler)
        childCoordinators.append(tabBarCoordinator)
        tabBarCoordinator.start()
    }
    
    func childDidFinnish(_ child:Coordinator?) {
        for (idx,coordinator) in childCoordinators.enumerated() {
            if coordinator === child {
                childCoordinators.remove(at: idx)
            }
        }
    }
    func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
        
            guard let fromVC = navigationController.transitionCoordinator?.viewController(forKey: .from) else { return }
            if navigationController.viewControllers.contains(fromVC) {
                return
            }
            if let homeVC = fromVC as? LoginViewController {
                childDidFinnish(homeVC.coordinator)
            }
    }

}
 

Функция childDidFinish основана на функции Пола, но я понятия не имею, как ее использовать

Итак, вот как я пытался это реализовать

Войдите в Кординатор:

 final class LoginCoordinator:NSObject, Coordinator {
    weak var parentCoordinator:AppCoordinator?
    
    private(set) var childCoordinators: [Coordinator] = []
    private let navigationController : UINavigationController
    private let loginVC = LoginViewController.instantiate()
    
    init (navigationController:UINavigationController) {
        self.navigationController = navigationController
    }
    func start() {
        navigationController.delegate = self
        loginVC.coordinator = self
        navigationController.isNavigationBarHidden = true
        navigationController.pushViewController(loginVC, animated: true)
    }
    func gotoLogin() {
       navigationController.popToRootViewController(animated: true)
    }
    func gotoRegister(){
        let registerVC = RegisterViewController.instantiate()
        registerVC.coordinator = self
        navigationController.pushViewController(registerVC, animated: true)
    }
    func gotoHome() {
        let tabBarCoordinator = TabBarCoordinator(navigationController: navigationController)
        childCoordinators.append(tabBarCoordinator)
        tabBarCoordinator.start()
    }
    func gotoTerdaftar() {
        let terdaftarVC = ListKorperasiViewController()
        terdaftarVC.coordinator = self
        navigationController.pushViewController(terdaftarVC, animated: true)
    }
    func popView() {
        navigationController.popViewController(animated: true)
    }
    //Check if user is login or not
    func userIsLogin() {
        parentCoordinator?.userIsValid(self)
    }
}
 

Комментарии:

1. если я неправильно использую шаблон, пожалуйста, дайте мне знать. потому что мой источник на сегодняшний день взламывает только swift

Ответ №1:

вы можете добавить закрытие для своего дочернего координатора var finish: (() -> Void)? И связать значение с этим закрытием в родительском координаторе.

 let loginCoordinator = LoginCoordinator(navigationController: navigationControler) 
childCoordinators.append(loginCoordinator)
loginCoordinator.finish = { do something like remove coordinator from childCoordinators and start a new coordinator }
loginCoordinator.start()