我在我的应用中使用了多个故事板,这被认为是一种很好的做法。例如,在我FooViewController
的{{1}}中,当点击按钮时,我会以编程方式跳转到Main.storyboard
中定义的另一个BarViewController
。
故事板和视图控制器之间的转换在单独的文件中实现,例如, Secondary.storyboard
,如下所示:
Storyboards
然后在// in Storyboards.m
@implementation Storyboards
+ (id)instantiateBarViewController {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Secondary" bundle:nil];
return [storyboard instantiateViewControllerWithIdentifier:@"BarViewController"];
}
@end
,我这样做了:
FooViewController
这很好用。但我的问题是:
// in FooViewController.m
- (IBAction)someButtonTapped:(id)sender {
BarViewController *controller = [Storyboards instantiateBarViewController];
[self.navigationController pushViewController:controller animated:YES];
}
时,我都不需要重新创建故事板?instantiateBarViewController
?要缓存storyboard(和视图控制器),我可以使用以下代码:
BarViewController
谢谢!
答案 0 :(得分:6)
我说"不要。"
保持对这样的资源的引用意味着你在内存受限的设备上将内容填充到内存中,永远不会让它们离开。 开发人员不好!没有cookie! ;-)
你有什么证据表明这比让系统管理缓存或破坏从xib重复加载的资源(它确实如此)更好?我说你的做法可能弊大于利。请记住,简单地创建一个故事板实例并不能直接转换为每次从文件系统加载它#34;。系统相当智能地管理它,因此不需要通过维护从未发布的引用来使其短路。
如果你正试图解决一些性能问题,我强烈建议使用Instruments测量性能并从那里开始。我非常怀疑它是故事板/ xib加载问题。
答案 1 :(得分:3)
单身人士似乎有点过分 - 你需要从故事板中实例化一个视图控制器:
[[UIStoryboard storyboardWithName: @"<storyboard-name>" bundle: nil] instantiateViewControllerWithIdentifier: @"<identifier>"];
或
[[UIStoryboard storyboardWithName: @"<storyboard-name>" bundle: nil] instantiateInitialViewController];
或
[self.storyboard instantiateViewControllerWithIdentifier: @"<identifier>"];
保持简单!