依赖注入 – 使用带有视图控制器初始化器的故事板的台风
我想用故事板创建一个名为“child”的视图控制器,所以我定义:
- (TyphoonStoryboard *)storyBoard { return [TyphoonDefinition withClass:[TyphoonStoryboard class] configuration:^(TyphoonDefinition* definition) { [definition useInitializer:@selector(storyboardWithName:factory:bundle:) parameters:^(TyphoonMethod *initializer) { [initializer injectParameterWith:@"Storyboard"]; [initializer injectParameterWith:self]; [initializer injectParameterWith:[NSBundle mainBundle]]; }]; definition.scope = TyphoonScopeSingleton; //Let's make this a singleton }]; } - (ChildViewController *)childViewControllerFromStoryboard { return [TyphoonDefinition withFactory:self.storyBoard selector:@selector(instantiateInitialViewController)]; } 我将有一个将包含子视图控制器的根视图控制器 - (RootViewController *)rootViewController { return [TyphoonDefinition withClass:[RootViewController class] configuration:^(TyphoonDefinition *definition) { [definition useInitializer:@selector(initWithChildViewController:) parameters:^(TyphoonMethod *initializer) { [initializer injectParameterWith:self.childViewControllerFromStoryboard]; }]; }]; } 最后一部分只是为子视图控制器注入依赖项: - (ChildViewController *)childViewController { return [TyphoonDefinition withClass:[ChildViewController class] configuration:^(TyphoonDefinition *definition) { // Initilization doesn't work. [definition useInitializer:@selector(initWithData:) parameters:^(TyphoonMethod *initializer) { [initializer injectParameterWith:self.data]; }]; // Property injection does. // [definition injectProperty:@selector(data)] }]; } 超级正常,我只是使用它的初始化器,但它永远不会被调用.我认为这是因为始终使用initWithCoder:指定用于故事板的那个. 问题: >可以在故事板中使用视图控制器初始化程序吗?它看起来像没有,类似于appDelegate. 提前致谢. 解决方法
感谢您对Typhoon的兴趣!
不,你不能初始化对象两次(你可以调用init方法两次,但它奇怪和不正确,可能导致错误). 从Xib / Storyboard创建的每个UIViewController和UIView都使用initWithCoder:initialization方法. 相反,您可以使用方法注入并注入setData:或使用属性注入.
最简单的方法是使用plist bootstrapping. (当Info.plist中指定的初始故事板名称时) 检查指南: https://github.com/typhoon-framework/Typhoon/wiki/Obtaining-Built-Components#first-bootstrap-typhoon-using-either 但是如果你有更多的故事板,那么你可以在plist中指定initial,在assembly中指定其他.
是的,您可以使用运行时参数台风功能. - (TyphoonStoryboard *)storyBoardWithName:(NSString *)name { return [TyphoonDefinition withClass:[TyphoonStoryboard class] configuration:^(TyphoonDefinition* definition) { [definition useInitializer:@selector(storyboardWithName:factory:bundle:) parameters:^(TyphoonMethod *initializer) { [initializer injectParameterWith:name]; // <-- runtime argument injection [initializer injectParameterWith:self]; [initializer injectParameterWith:[NSBundle mainBundle]]; }]; }]; } 这是你要求的吗? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |