使用RxSwift的Tabbar Controller的Swift,变量订阅

时间:2018-06-24 14:24:56

标签: swift uitabbarcontroller reactive-programming rx-swift

我正在尝试在Tabbar Controller中嵌入的应用程序中使用Rxswift。

我在标签栏中有三个视图控制器。所有视图控制器中的订阅很少。但是为了简单起见,可以说第一和第二视图控制器订阅第三视图控制器以获取一些值。

我已按代码订阅了第三个视图控制器;

    func startSubscription() {
    let settingsNavigationVC = self.tabBarController?.viewControllers![2] as! UINavigationController
    let settingsVC = settingsNavigationVC.topViewController as! SettingsViewController
    settingsVC.selectedUser.subscribe(onNext: { [weak self] user in
        self?.userToShow = user
    }).disposed(by: disposeBagForFirst)
    }

如果在操作任何数据之前先轻按所有选项卡,则所有订阅都可以启动并且所有应用正常运行,这可以正常工作。但是,如果用户在加载应用程序后直接点击第三个vc,然后进行更改。然后,第一个vc处的数据将得到更新,因为它已在应用启动时已加载,但第二个vc处的数据没有更改,因为还没有订阅,因为在第三个vc中进行更改之前尚未加载视图。

我尝试使用实例化vc方法来执行此操作,但这也不起作用,因为使用选项卡栏控制器,实例化视图不止一次。

我的问题是;我该如何确保在用户与该应用进行交互之前加载所有视图,或者无论是否单击了所有选项卡(加载了视图),如何更改我的订阅方法以使其起作用。

谢谢。

1 个答案:

答案 0 :(得分:0)

在此解决方案中,我从第一个vc的viewDidLoad()方法加载所有视图。如果您对如何修改订阅技术有任何想法,而不必加载所有视图,请提供答案。

感谢How to load all views in UITabBarController?

,我找到了解决方案

由于我使用导航控制器,因此略有不同。在所有配置,数据提取和所有操作完成之后,我在viewDidLoad()的末尾调用此方法。

    func loadAllViewsOfTabbarController() {
        if let viewControllers = tabBarController?.viewControllers {
            for viewController in viewControllers {
                let viewInNav = viewController as! UINavigationController
                let _ = viewInNav.topViewController?.view!
            }
        }
    }