Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 带有UINavigationControllers和uitabarcontroller的协调器模式_Ios_Swift_Uinavigationcontroller_Uitabbarcontroller_Coordinator Pattern - Fatal编程技术网

Ios 带有UINavigationControllers和uitabarcontroller的协调器模式

Ios 带有UINavigationControllers和uitabarcontroller的协调器模式,ios,swift,uinavigationcontroller,uitabbarcontroller,coordinator-pattern,Ios,Swift,Uinavigationcontroller,Uitabbarcontroller,Coordinator Pattern,我试图学习如何将协调器模式集成到iOS开发中 我有一个这样的应用程序。在故事板中,它看起来像这样。导航控制器和选项卡栏不会添加到故事板中,因为根据协调器模式,它们将以编程方式添加 第一个视图控制器是PhoneViewController,它获取用户的电话号码。此视图控制器嵌入在导航控制器中。输入电话号码后,它会移动到VerifyPhoneViewController。验证后,它将移动到包含三个选项卡的选项卡栏控制器。这些视图控制器中的每一个都有自己的独立导航控制器 我有一个协议,其中包含每个协

我试图学习如何将协调器模式集成到iOS开发中

我有一个这样的应用程序。在故事板中,它看起来像这样。导航控制器和选项卡栏不会添加到故事板中,因为根据协调器模式,它们将以编程方式添加

第一个视图控制器是
PhoneViewController
,它获取用户的电话号码。此视图控制器嵌入在导航控制器中。输入电话号码后,它会移动到
VerifyPhoneViewController
。验证后,它将移动到包含三个选项卡的选项卡栏控制器。这些视图控制器中的每一个都有自己的独立导航控制器

我有一个协议,其中包含每个协调员需要实现的所有必要属性和功能

protocol Coordinator {
    var childCoordinators: [Coordinator] { get set }
    var navigationController: UINavigationController { get set }

    func start()
}
我为应用程序的身份验证流部分创建了一个名为
authcoardinator
的单独协调器

class AuthCoordinator: Coordinator {
    var childCoordinators = [Coordinator]()

    var navigationController: UINavigationController

    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
    }

    // The initial view
    func start() {
        let phoneViewController = PhoneViewController.instantiate()
        phoneViewController.coordinator = self
        navigationController.pushViewController(phoneViewController, animated: false)
    }

    func submit(phoneNo: String) {
        let verifyPhoneViewController = VerifyPhoneViewController.instantiate()
        verifyPhoneViewController.coordinator = self
        verifyPhoneViewController.phoneNo = phoneNo
        navigationController.pushViewController(verifyPhoneViewController, animated: true)
    }

    // Move to the tabbarcontroller
    func main() {
        let mainViewController = MainViewController.instantiate()
        navigationController.pushViewController(mainViewController, animated: true)
    }
}
导航工作正常。但是有一个小问题

请注意,移动到tabbarcontroller后,在视图控制器之间切换时,导航栏中不会显示标题(我在每个视图控制器的
viewDidLoad
方法中设置了标题)。再加上
VerifyPhoneViewController
的后退按钮也仍然存在

问题是显而易见的。我为
AuthCoordinator
初始化的navigationcontroller仍在顶部。我将
MainViewController
推到该堆栈上

func main() {
    let mainViewController = MainViewController.instantiate()
    navigationController.pushViewController(mainViewController, animated: true)
}
我想不出的是一种而不是这样做的方法。我可以在
start
方法中隐藏导航栏,但这并不理想,因为它隐藏了导航栏,我不希望这样

func start() {
    let phoneViewController = PhoneViewController.instantiate()
    phoneViewController.coordinator = self
    navigationController.navigationBar.isHidden = true
    navigationController.pushViewController(phoneViewController, animated: false)
}
是否有其他方法在身份验证流期间保留navigationcontroller,然后在显示
MainViewController
后立即放弃它


演示项目已上载。

我现在也在学习MVC+坐标模式。我和你有类似的安排。您不能为PhoneVerifyVC和VerifyPhoneVC添加
navigationController.setNavigationBarHidden(true,动画:false)
,并在TabBarController
false
中添加,然后在开始时执行此操作()Hi@Isuru,可以使用MVVM CRxSwift在UITabbarController中帮助我吗?或者如果你有演示,请帮助我。