我正在帮助某人完成一个 xcode 项目,但这几乎是不可能的。他们的故事板上有大约 100 个视图控制器,而且运行速度非常慢。我已经遵循了有关使 Xcode 更快的所有指南,但它们对这种情况没有帮助。在该故事板之外,当我们在 .h 和 .m 文件中工作时,它运行得非常好,它只是在故事板内部运行缓慢。有没有人有过这样的项目经验?你做了什么?或者我可以做些什么来使在故事板中工作成为可能?谢谢
7 回答
我的解决方案是:从情节提要中打开一个新窗口并将其最小化。所以它保留在 RAM 中并且不会重新加载。现在使用故事板变得快速而轻松。
我在开发企业应用程序时遇到了同样的问题。在项目中,我在一个故事板中只有一个storyboard
和所有视图。打开故事板导致 Xcode 变得非常慢。
因此,我将情节提要按模块划分为多个情节提要,并为每个模块加载单独的情节提要,如下面的代码所示:
如果我想推送一个视图控制器:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"storyboardName"
bundle:nil];
UIViewController *viewController =
[storyboard instantiateViewControllerWithIdentifier:@"Members_ViewController"];
[self.navigationController pushViewController:viewController animated:YES];
我们遇到了同样的问题,通常推荐的性能调整没有帮助。在配备 SSD 的 MacBook Pro 上,我看到在情节提要视图中 CPU 利用率达到 80-90%,并且导航延迟令人难以置信。模拟器可能需要一分钟才能显示,而且 Xcode 通常不会关闭,需要强制退出。
如果不查看情节提要,或者情节提要作为源代码打开,这些症状都会消失。
更新:我们将项目分成多个情节提要,生活再次美好——CPU 利用率回到个位数,性能与 Xcode 4.6.3 相当。更大的故事板肯定存在问题;在此过程中对我们的代码所做的唯一更改是将对主故事板的引用更新为 storyboardWithName 调用。
我们项目中的一个视图控制器有一个容器视图,当该控制器及其容器视图移动到单独的故事板时,使用问题似乎停止了。这可能是一个巧合,为了保持一致性,我们拆分了故事板的其余部分,但如果我再次处理这个问题,我会首先将任何带有容器视图的视图控制器移动到单独的故事板中。
如果您使用的是 Xcode 7,Storyboard References 是创建多个故事板的快速方法,肯定会帮助解决这个问题。使用 Storyboard References 的好处是它不涉及任何额外的代码!有关如何设置的完整说明,请参阅下面的 stackoverflow 链接。
我面临同样的问题。非常令人沮丧。我的故事板只有 41 个视图。我正在运行运行在 2.3Ghz 的 Mac Min i7。故事板打开后,需要很长时间才能完成非常简单的任务,例如移动 UILABEL?然后,在对应的视图中,编辑代码就像回到 ZX81 上。将“智能”融入故事板是非常好的,但不会以牺牲开发效率为代价。就故事板“大小”准则而言,我不记得读过故事板必须拆分超过一定大小。也许我需要阅读更多。
要进行所需的更改,即拆分情节提要,在几个情节提要上添加一些 VC,需要花点功夫。我想如果这是新的最佳实践,那很好。但我可以做的不仅仅是猜想。
我也同意在多个故事板上组织您的观点。当您有一个从其他几个视图调用的视图时,它变得非常方便。那么故事板就会变得像意大利面一样,不清楚。就我而言,我有一个可以从多个视图调用的相机视图,我把它放在一个新的故事板上,效果很好。由于相机视图也指向搜索顺序视图,因此我不得不将搜索顺序视图也放在单独的情节提要上。我的主要故事板再次变得更简单。
所以有一个主故事板,并尽可能多地分开到单独的故事板上。我制作了一个通用类 StoryBoardNavigation,在其中我集中了所有函数来调用子故事板。
这是一个例子:
此函数导航到名为 OrderLookupStoryboard 的故事板,并在起始位置打开视图。
+(void) NavigateToOrderLookupFrom:(UIViewController *)vc
{
UIStoryboard * sb = [UIStoryboard storyboardWithName:@"OrderLookupStoryboard" bundle:nil];
UIViewController * vcTo = [sb instantiateInitialViewController];
[UIView transitionWithView:vc.view duration:0.8 options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
[vc.navigationController pushViewController:vcTo animated:NO];
}
completion:NULL];
}
此函数将一些参数传递给情节提要。
+(void) NavigateToCameraFrom:(UIViewController *)vc WithSelectedZone:(int)selectedZone
{
UIStoryboard * sb = [UIStoryboard storyboardWithName:@"CameraStoryboard" bundle:nil];
MediaCapture * vcTo = [sb instantiateInitialViewController];
vcTo.selectedZone = selectedZone;
vcTo.zoneSet = YES;
[UIView transitionWithView:vc.view duration:0.8 options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
[vc.navigationController pushViewController:vcTo animated:NO];
}
completion:NULL];
}
此函数以模块转换样式打开视图:
+(void) NavigateToSignatureFrom:(UIViewController *)vc withSignee:(NSString *) Signee
{
UIStoryboard * sb = [UIStoryboard storyboardWithName:@"SignatureStoryboard" bundle:nil];
UIViewController * vcTo = [sb instantiateInitialViewController];
((SignatureVC *) vcTo).Signee = Signee;
[vcTo setModalTransitionStyle:UIModalTransitionStylePartialCurl];
[vc presentViewController:vcTo animated:YES completion:nil];
}
我想补充一点,在使用带有导航控制器的容器视图时,我的故事板响应缓慢时遇到了问题。我什至尝试将它放在自己的故事板中,但它仍然很慢,我什至无法使用它。似乎当容器视图调整导航控制器的大小时,导航栏导致了问题。
我可以通过在情节提要中选择导航控制器来解决此问题,通过取消选中属性检查器中的“显示导航栏”并在视图控制器类的 viewDidLoad 或 viewWillAppear 中使用“isNavigationBarHidden = false”来隐藏导航栏。