我在我的应用程序中使用了StoryBoard。当我第一次开始整合Typhoon时,我在plist中列出了Assemblies如下:
<key>TyphoonInitialAssemblies</key>
<array>
<string>ApplicationAssembly</string>
<string>CoreComponents</string>
</array>
当我注入AppDelegate时,这很好用。
现在,如果我需要注入各种视图控制器,似乎我必须从应用程序plist文件中删除UILaunchStoryboardName
和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中列出了程序集,我可以以某种方式使用它吗?
答案 0 :(得分:5)
看来我必须从应用程序plist文件中删除UILaunchStoryboardName和UIMainStoryboardFile,并使用TyphoonStoryboard这样
不正确的。您可以在info.plist文件中组合UIMainStoryboardFile(UILaunchStoryboardName)和TyphoonInitialAssemblies键。
在这种情况下,创建的故事板将是TyphoonStoryboard并且有台风工厂(使用plist程序集中指定创建)。
您可以完全按照您通常使用的方式使用故事板,还可以根据您的一个或多个TyphoonAssembly
类中的定义注入依赖项。
答案 1 :(得分:3)
正如Aleksey在他的回答中所说,只要使用plist集成,以及通常的UILaunchStoryboardName
和UIMainStoryboardFile
,Typhoon就会确保任何Storyboard都是TyphoonStoryboard
。完全与普通故事板一样使用,还有一个额外的好处,即根据TyphoonAssembly
类中的定义注入依赖项。
TyphoonComponentFactory将由故事板保留,因此将在您的应用程序的整个生命周期中保留。
故事板之外:(即MacOS应用程序,实用程序等)
TyphoonComopnentFactory确实设计为在应用程序的整个生命周期中保留。 (如果你愿意,你可以做点别的事)。
关键概念:
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”,我们就可以使用它来从一个对象图转到另一个对象图。
TyphoonScopeObjectGraph
,这意味着您可以加载视图控制器,包括任何委托和循环引用。完成后,它将从内存中丢弃。 TyphoonScopeSingleton
(或TyphoonScopeWeakSingleton
)的任何组件。 有关此功能的更多信息,请参见User Guide here。
<强>要点:强>
stackoverflow.com/questions/26492175/typhoon-storyboard-integration