我在plist中配置初始程序集,用于实例化故事板中的第一个控制器。
稍后在应用程序中我将使用以下方式更改根视图控制器:
TyphoonStoryboard* storyboard = [TyphoonStoryboard storyboardWithName:storyboardType factory:factory bundle:nil];
UIViewController* newRootView = [storyboard instantiateViewControllerWithIdentifier:identifier];
self.window.rootViewController = newRootView;
我想在实例化新视图控制器时使用相同的程序集。原因是我希望单身人士保持单身人士。如果程序集/工厂更改,则会再次创建所有类,包括单例。
如何让工厂用于初始化故事板中的第一个视图控制器?
答案 0 :(得分:4)
紧密的故事板集成:
只要使用plist integration,以及通常的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的回调钩子。通过覆盖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迁移出去,您只需提供一个替代的程序集实现。
从一个对象图开始到另一个:
一旦某个组成部分出现“台风”问题'使用上述任一方法,我们可以使用它从一个对象图到另一个对象图。
TyphoonScopeObjectGraph
,这意味着您可以加载视图控制器,包括任何委托和循环引用。完成后,它将从内存中丢弃。 TyphoonScopeSingleton
(或TyphoonScopeWeakSingleton
)的任何组件。 有关此功能的更多信息,请参见User Guide here。
从一个故事板开始到另一个故事板:
以编程方式在应用程序的某个位置实例化新的故事板(例如视图控制器):
UIStoryboard *board = [TyphoonStoryboard storyboardWithName:@"name"
factory:factory bundle:[NSBundle mainBundle]];
。 。使用上面的方法1或方法2获得工厂。
<强>要点:强>