【问题标题】:Exit Coordinator in Coodinator Pattern in swift快速退出协调器模式中的协调器
【发布时间】:2021-09-17 14:07:19
【问题描述】:

我是协调器模式的初学者, 所以我正在尝试创建一个简单的登录屏幕

加载应用程序 -> 登录屏幕 -> 主屏幕

我读了一篇 Hacking with Swift 关于协调器模式的文章,但对于如何退出协调器仍然有些困惑。

那么我如何退出协调器? 据我所知,父协调器由登录协调器和主屏幕协调器组成,为了访问主屏幕协调器,您需要清除父协调器中的子协调器,然后添加主屏幕协调器。对吗?

所以基本上我想做的是回到父协调器,然后将 Min View Coordinator 设置为父协调器子 提前致谢

家长协调员:

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 函数是基于 Paul 的,但我不知道如何使用它

这就是我尝试实现它的方式

登录协调器:

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)
    }
}

【问题讨论】:

  • 如果我做错了模式,请告诉我。因为到目前为止,我的来源只是用 swift 进行黑客攻击

标签: swift uikit


【解决方案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()

【讨论】:

    猜你喜欢
    • 2020-05-04
    • 2019-02-09
    • 2018-10-27
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多