故事板中的视图太多 – Xcode运行缓慢
我正在帮助某人使用xcode项目,但这几乎是不可能的。 他们在故事板上有大约100个视图控制器,而且运行速度非常慢。 我已经遵循了使Xcode更快的所有指南,但对这种情况并没有帮助。 在故事板之外,当我们在.h和.m文件中工作时,它运行的很好,只是在故事板内运行缓慢。 有没有人有这样的项目的经验? 你做了什么? 或者我能做些什么才能在故事板上工作? 谢谢
我在使用企业应用程序时面临同样的问题。 在这个项目中,我只有一个storyboard
和一个storyboard
所有视图。 打开故事板导致Xcode变得非常慢。
所以我把故事板按模块分成多个故事板,并在每个模块中加载一个单独的故事板,如下面的代码所示:
如果我想推视图控制器:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"storyboardName" bundle:nil]; UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"Members_ViewController"]; [self.navigationController pushViewController:viewController animated:YES];
我的解决scheme是:从故事板打开一个新窗口,并将其最小化。 所以它留在RAM中,不会重新加载。 现在使用故事板保持快速和简单。
我们遇到同样的问题,通常build议的性能调整没有帮助。 在配备SSD的MacBook Pro上,我发现在故事板视图中CPU利用率达到80-90%,导航延迟令人难以置信。 模拟器可能需要一分钟才能显示,而且Xcode经常不会closures,需要强制退出。
如果不查看故事板,或者故事板以源代码的forms打开,这些症状全部消失。
更新:我们把我们的项目分成多个故事板,生活再次变好–CPU利用率回到了一位数,性能与Xcode 4.6.3相当。 更大的故事板肯定是一个问题。 在这个过程中对我们的代码所做的唯一更改是将主要故事板的引用更新为storyboardWithName调用。
我们项目中的一个视图控制器有一个容器视图,当控制器及其容器视图移动到一个单独的故事板时,似乎停止了利用率问题。 这可能是一个巧合,为了保持一致性,我们分解了故事板的其余部分,但是如果我再次处理这个问题,首先将任何具有容器视图的视图控制器移动到单独的故事板。
如果您使用的是Xcode 7,故事板参考是创build多个故事板的快速方法,并且肯定会帮助解决这个问题。 关于使用Storyboard References的好处是它不涉及任何额外的代码! 有关如何设置的完整说明,请参阅下面的计算器链接。
我面临同样的问题。 非常令人沮丧。 我的故事板只有41个意见。 而且我运行的是2.3GHz的Mac Min i7。 随着故事板打开,需要很长时间才能完成非常简单的任务,比如移动UILABEL? 然后,在对方视图中,编辑代码就像在ZX81上一样。 这一切都很好,很好地把“情报”放在故事板上,但不以开发效率为代价。 就故事板“大小”的指导方针而言,我永远不会记得阅读故事板必须被分割超过一定的尺寸。 也许我需要阅读更多。
为了做出所需的改变,即将故事板分开,在几个故事板上拍一些VC,需要一点点时间。 我想如果这是新的最佳做法,那很好。 但我可以做的不仅仅是猜想。
我也同意在多个故事板上组织你的观点。 当您从其他视图中调用视图时,它变得非常方便。 然后故事板可以变得像面食,不清楚。 在我的情况下,我有一个可以从几个视图中调用的相机视图,我把它放在一个新的故事板上,这很好。 由于相机视图也指向search顺序视图,因此我必须将search顺序视图也放在单独的故事板上。 我的主要故事板再次变得更简单。
所以有一个主要的故事板,并尽可能多地分离故事板。 我做了一个普通类的StoryBoardNavigation,我集中了所有的function来调用子故事板。
这是一个例子:
此function导航到名为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]; }
这个函数将一些parameter passing给故事板。
+(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]; }
此function以模块转换样式打开视图:
+(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]; }
我想补充一点,在使用容器视图和导航控制器时,我的故事板缓慢响应。 我甚至试图把它放在自己的故事板,它仍然是如此之慢,我甚至无法使用它。 看来,当容器视图是调整导航控制器,导航栏导致的问题。
我能够通过select故事板中的导航控制器来解决这个问题,通过在属性检查器中取消选中“显示导航栏”并在视图控制器类的viewDidLoad或viewWillAppear中使用“isNavigationBarHidden = false”来隐藏导航栏。