如何将依赖注入到UITabBarController中更多导航控制器中的viewController?

时间:2018-02-12 22:12:05

标签: ios swift xcode dependency-injection uitabbarcontroller

我有一个应用,其主视图是UITabBarController子类,其中包含NSPersistentContainer

TabBarController提供的某些UIView子类需要能够访问NSPersistentContainer。这些UIView子类大多嵌入UINavigationController中。

为了便于检查哪个需要NSPersistentContainer,我创建了一个名为NeedsContainer的协议,并使相应的UIView子类符合该协议。

我抓住了viewController func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController){ 检查它是否为UINavigationController,如果是{I},请询问.topViewController并检查其是否符合NeedsContainer。如果是这种情况,我会注入NSPersistentContainer

直到......才能正常工作。

我现在有更多场景,而不适合tabBar溢出到moreNavigationController

这里有一些代码,附有打印语句,以帮助我调试最新情况

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController){

    print("\ntab selected****************************************")
    print("ViewController is type :\(type(of: viewController))")
    print("****************************************************")


    if viewController.isKind(of: UINavigationController.self) {
        print("ploughing through")
        if let navController = viewController as? UINavigationController {
            print ("**it let let navController = viewController as? UINavigationController ")
            if var actualViewController = navController.topViewController! as? NeedsContainer {
                print("actualView controller is kind of :\(type(of: actualViewController))")
                actualViewController.container = container
                print("passed in container")
            } else {
                print("Its not a NeedsContainer , its a \(type(of:navController.topViewController))")
            }
        }else {
            print("it didnt let navController = viewController as? UINavigationController ")
        }
    }

}
 `

点击moreNavigationController中的一个选项会启动场景,但不会注入NSPersistentContainer

当我选择tabBar中的more按钮时,输出会显示输出 ...

tab selected****************************************
ViewController is type :UIMoreNavigationController
****************************************************
ploughing through
**it let let navController = viewController as? UINavigationController 
Its not a NeedsContainer , its a Optional<UIViewController>

当我点击moreNavigationcontroller中的某个选项时,控制台上没有任何内容。 Xcode在新场景中持久容器为零的检查时崩溃。

所以我发现了......

  • .moreViewController实际上是类型 UIMoreNavigationController

  • UIMoreNavigationController未记录,但必须是其子类 UINavigationController因为我的代码通过了 检查。

  • Xcode会抛出错误,你试着参考 UIMoreNaviagtionController因此您无法询问是否有类似内容。

  • 点击moreNavigationContoller中的单元格显然没有 致电func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController)

那么,如何从最终在NSPersistentContainer上的选项中注入moreNavigationController

作为一种解决方法而不是我的问题的答案,我在写这篇文章时意识到需要NSPersistentContainer的类可以访问他们的.tabBarController属性并返回到它并抓住{{1 }}。这是有效的,我已经尝试过了,但与从persistentContainer子类中注入依赖项相比,这似乎是错误的方法。

0 个答案:

没有答案