我想用故事板创建一个名为“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.
>这是直接从装配中使用故事板的最简单方法吗?
>如果我有几个故事板,有没有一种方法可以参数化地定义故事板?我不想最终得到像storyBoard1,storyBoard2,…,storyBoardN这样的东西.
提前致谢.
解决方法
感谢您对typhoon的兴趣!
- Is possible to use view controller initializers with storyboards? It looks like no,similar to appDelegate.
不,你不能初始化对象两次(你可以调用init方法两次,但它奇怪和不正确,可能导致错误).
从Xib / Storyboard创建的每个UIViewController和UIView都使用initWithCoder:initialization方法.
相反,您可以使用方法注入并注入setData:或使用属性注入.
- Is this the simplest approach to use storyboards directly from the assembly?
最简单的方法是使用plist bootstrapping. (当Info.plist中指定的初始故事板名称时)
检查指南:
但是如果你有更多的故事板,那么你可以在plist中指定initial,在assembly中指定其他.
- If I have several storyboards,is there a way of defining the storyboards parametrically? I don’t want to end up with something like storyBoard1,storyBoardN.
是的,您可以使用运行时参数台风功能.
使用运行时参数,您的定义变为
- (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]]; }]; }]; }
这是你要求的吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。