台风故事板整合

时间:2014-10-21 16:58:22

标签: typhoon

我在我的应用程序中使用了StoryBoard。当我第一次开始整合Typhoon时,我在plist中列出了Assemblies如下:

<key>TyphoonInitialAssemblies</key>
<array>
    <string>ApplicationAssembly</string>
    <string>CoreComponents</string>
</array>

当我注入AppDelegate时,这很好用。

现在,如果我需要注入各种视图控制器,似乎我必须从应用程序plist文件中删除UILaunchStoryboardNameUIMainStoryboardFile,并使用TyphoonStoryboard之类的:

- (BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    NSString *storyboardName = ...
    TyphoonComponentFactory *factory = ...

    TyphoonStoryboard *storyboard = [TyphoonStoryboard 
        storyboardWithName:storyboardName factory:factory bundle:nil];

    self.window = ...
    self.window.rootViewController = [storyboard instantiateInitialViewController];
    [self.window makeKeyAndVisible];

    return YES;
}

然而,我很困惑我获得TyphoonComponentFactory的地方。既然我已经在plist中列出了程序集,我可以以某种方式使用它吗?

2 个答案:

答案 0 :(得分:5)

  

看来我必须从应用程序plist文件中删除UILaunchStoryboardName和UIMainStoryboardFile,并使用TyphoonStoryboard这样

不正确的。您可以在info.plist文件中组合UIMainStoryboardFile(UILaunchStoryboardName)和TyphoonInitialAssemblies键。

在这种情况下,创建的故事板将是TyphoonStoryboard并且有台风工厂(使用plist程序集中指定创建)。

您可以完全按照您通常使用的方式使用故事板,还可以根据您的一个或多个TyphoonAssembly类中的定义注入依赖项。

答案 1 :(得分:3)

正如Aleksey在他的回答中所说,只要使用plist集成,以及通常的UILaunchStoryboardNameUIMainStoryboardFile,Typhoon就会确保任何Storyboard都是TyphoonStoryboard。完全与普通故事板一样使用,还有一个额外的好处,即根据TyphoonAssembly类中的定义注入依赖项。

TyphoonComponentFactory将由故事板保留,因此将在您的应用程序的整个生命周期中保留。


故事板之外:(即MacOS应用程序,实用程序等)

TyphoonComopnentFactory确实设计为在应用程序的整个生命周期中保留。 (如果你愿意,你可以做点别的事)。

关键概念:

  • 您可以按原样使用TyphoonComponentFactory
  • 此外,您的任何程序集界面都可以在TyphoonComponentFactory前面构建。在 构建时 ,程序集返回定义。 在运行时,它返回构建的组件

从一个对象图转换到另一个对象图时,有两种方法可以保留TyphoonComponentFactory。我们将此 称为“Typhoon aware”


方法1:注入装配体:

- (MyAppDelegate *)appDelegate
{
    return [TyphoonDefinition withClass:[MyAppDelegate class] 
        configuration:^(TyphoonDefinition *definition)
    {
        //Other injections . . . 
        [definition injectProperty:@selector(factory) with:self];
    }];
}

上面的示例将TyphoonComponentFactory注入名为factory的属性中。

  • 注入程序集时,它可以用作TyphoonComponentFactory
  • 它也可以用作任何装配类型。例如,您可以声明类型为components的属性CoreCompopnents并注入程序集。

有关此功能的更多信息,请参阅the User Guide here


方法2:使用回调挂钩:

使组件'Typhoon aware'的另一种方法是使用Typhoon的回调挂钩。通过覆盖NSObject category method s:

typhoonSetFactory:(id)thefactory

与上面的其他方法一样,工厂可以用作TyphoonComponentFactory或我前面摆出的任何装配接口,以下两种方法都可以:

typohoonSetFactory:(TyphoonComponentFactory*)factory
{
    //Do something with factory
}

typhoonSetFactory:(ApplicationAssembly*)assembly
{
    //Do something with assembly
}

在这两种方法中,使用最适合您的方法。我们推荐前者,因为它“非侵入性”意味着您自己的类不直接调用任何Typhoon API。如果您希望从Typhoon迁移出去,您只需提供一个替代的程序集实现。



从一个对象图开始到另一个:

一旦某个组件使用上述方法中的任何一个“Typhoon aware”,我们就可以使用它来从一个对象图转到另一个对象图。

  • Typhoon的默认范围是TyphoonScopeObjectGraph,这意味着您可以加载视图控制器,包括任何委托和循环引用。完成后,它将从内存中丢弃。
  • 同时保留TyphoonScopeSingleton(或TyphoonScopeWeakSingleton)的任何组件。

有关此功能的更多信息,请参见User Guide here



<强>要点:

  • 程序集遵循正常的Objective-C / Swift内存规则。因此,只要它被至少一个类使用,它将继续存在。使用上述“从一个对象图进行到另一个对象图”的过程意味着它将在您的应用程序的整个生命周期中持续存在。

stackoverflow.com/questions/26492175/typhoon-storyboard-integration