4

我在我的应用程序中使用 StoryBoard。当我第一次开始集成 Typhoon 时,我在 plist 中列出了组件,如下所示:

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

当我注入 AppDelegate 时,这工作得很好。

现在,如果我需要注入各种视图控制器,看来我必须从应用程序 plist 文件中删除UILaunchStoryboardNameand UIMainStoryboardFile,并使用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 中列出了程序集,我可以以某种方式使用它吗?

4

2 回答 2

5

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

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

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

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

于 2014-10-22T01:45:55.783 回答
3

正如 Aleksey 在他的回答中所说,只要使用 plist 集成以及通常的UILaunchStoryboardNameand UIMainStoryboardFile,那么 Typhoon 将确保任何 Storyboard 都是TyphoonStoryboard. 与普通情节提要完全一样使用,另外还有一个好处是依赖项将根据TyphoonAssembly类中的定义注入。

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


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

TyphoonComopnentFactory 确实设计为在您的应用程序的整个生命周期中保留。(尽管如果您愿意,您可以做其他事情)。

关键概念:

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

从一个对象图到另一个对象图时,有两种方法可以保留 TyphoonComponentFactory。我们将这种组件的制作称为“台风感知”


方法1:注入程序集:

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

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

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

可以在此处的用户指南中找到有关此功能的更多信息。


方法2:使用回调钩子:

使组件“感知台风”的另一种方法是使用 Typhoon 的回调挂钩。通过覆盖 NSObject 类别方法s:

typhoonSetFactory:(id)thefactory

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

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

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

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



从一个对象图前进到另一个对象图:

一旦组件使用上述任一方法“感知台风”,我们就可以使用它从一个对象图继续到另一个对象图。

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

有关此功能的更多信息,请参见此处的用户指南



概括:

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

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

于 2014-10-22T02:05:26.950 回答