objective-c – 如何将依赖关系注入iOS视图控制器?

前端之家收集整理的这篇文章主要介绍了objective-c – 如何将依赖关系注入iOS视图控制器?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的视图控制器需要发送消息到几个模型对象.如何在视图控制器中获取对这些模型对象的引用?

这些模型对象是“单例”(因为它们只能在系统中一次只有一个副本),并且它们被多个视图控制器使用.所以我不能在每个视图控制器的init方法中实例化它们.

我不能使用构造函数注入,因为运行时会选择用于创建视图控制器的init方法.

我不能使用“setter注入”,在任何时候(我所知道的),我有两个引用新构造的视图控制器和引用“单例”模型对象.

我不想将模型对象转换成正确的单例,并从视图控制器调用静态方法来检索单例实例,因为这是可测试性的一个问题. (将模型对象作为AppDelegate上的属性与执行此操作基本相同).

我正在使用iOS 6与Storyboards.

解决方法

我刚刚处理同样的问题.由于我使用的是故事板我不会实例化我的UIViewControllers,所以我不能使用“构造函数注入”.我必须使用setter注入辞职.

我的应用程序根目录是一个UITabViewController.假设它有两个UINavigationControllers,拥有第一个AControllerView和第二个BControllerView.在AppDelegate.applicationDidFinishLaunchingWithOptions中,您可以通过以下方式检索根控制器:

UITabBarController * tabBarController =(UITabBarController *)self.window.rootViewController;

然后你可以遍历控制器:

NSArray* viewControllers = [tabBarController viewControllers];
for (UIViewController *viewController in viewControllers) {
    UINavigationController *navigationController = (UINavigationController*) viewController;
    UIViewController *viewController = navigationController.topViewController;
    if ([viewController isKindOfClass: [AControllerView class]]) {
        AControllerView *a = (AControllerView*) viewController;
        // Inject your stuff
    }
    if ([viewController isKindOfClass: [BControllerView class]]) {
        BControllerView *b = (BControllerView*) viewController;
        // Inject your stuff
    }
}

希望它有帮助.

猜你在找的C&C++相关文章