如何将依赖项注入iOS视图控制器?

Rob*_*ins 10 objective-c inversion-of-control ios ios6

我的视图控制器需要向几个模型对象发送消息.如何在视图控制器中获取对这些模型对象的引用?

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

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

我不能在任何时候使用"setter injection"(我知道)我是否同时引用了新构造的视图控制器和对"singleton"模型对象的引用.

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

我正在使用iOS 6和Storyboard.

jua*_*osl 8

我刚刚处理了同样的问题.由于我使用的是故事板我没有实例化我的UIViewControllers,所以我不能使用"构造函数注入".我必须使用二传手注射来辞职.

我的应用根是一个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
    }
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.

  • 我们称之为"提升自定义IOC容器"的方法.如果您要走这条路线,您很快就会到达GitHub上的一个Spring灵感的Objective-C IOC容器.我对你到达那里需要多长时间的反馈感兴趣. (2认同)

Kju*_*uly 5

为什么不使用NSNotificationCenter

NSNotificationCenter 对象(或简称通知中心)提供了一种在程序内广播信息的机制。NSNotificationCenter 对象本质上是一个通知调度表。

你可以在单例或普通的情况下添加通知观察者,当你需要发送消息时,只需发布​​正确的通知即可。然后观察员将管理行动。

有关 NSNotificationCenter 的更多详细信息