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



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

这些模型对象是"单例"(因为系统中应该只有一个副本),并且由多个视图控制器使用。因此,我无法通过每个视图控制器的初始方法实例化。

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

我不能使用"设置器注入",因为(我知道)我既有对新构建的视图控制器的引用,又是对" Singleton"模型对象的引用。

i不想要想要将模型对象转换为适当的单例,并从视图控制器上调用静态方法以检索单例实例,因为这是可检验性的问题。(将模型对象作为AppDelegate上的属性与此基本相同。)

我正在将iOS 6与故事板一起使用。

我刚刚处理了同样的问题。由于我正在使用故事板,因此我不实例化UIViewControllers,因此我无法使用"构造函数注入"。我必须使用固定器注射辞职。

我的应用程序根是UITabViewController。假设它具有两个UINavigationController s,其中第一个A 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
    }
}

希望它有帮助。

为什么不使用 NSNotificationCenter

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

您可以在Singleton或Common One上添加通知观察者,当您需要发送消息时,只需发布正确的通知即可。观察者将管理动作。

nsnotificationcenter的更多详细信息。

这不是关于获取对视图控制器对象的引用吗?如果您使用的是故事板,则Windows rootViewController或所使用的细分将为您提供正确的视图控制器对象。

即:当应用启动时,视图控制器的实例为

self.window.rootViewController

当您是场景之间过渡(查看控制器)时:

[segue destinationViewController][segue sourceViewController]

如果您使用的是XIB,甚至可以使用接口构建器中的外部对象(代理对象)来提供模型对象。唯一的是您必须将笔尖的实例化掌握在自己的手中。

理想情况下,即使使用故事板,也将允许第三方开发人员使用自己的构造函数/初始化器。

在此之前,您可以使用Setter/property注入和调解器图案,尤其是因为您习惯了最佳实践和松动的耦合。

我已经在这里写了有关它的文章:http://cocoapatterns.com/passing-data-between-view-controllers/

最新更新