故事板中的视图太多 - Xcode运行缓慢

时间:2013-09-10 04:29:56

标签: ios xcode performance storyboard

我正在用xcode项目帮助某人,但这几乎是不可能的。他们的故事板上有大约100个View控制器,它运行速度非常慢。我已经遵循了所有关于使Xcode更快的指南,但他们对这种情况没有帮助。在那个故事板之外,当我们在.h和.m文件中工作时,它运行得非常好,它只是在故事板内运行缓慢。 有没有人对这样的项目有过任何经验?你做了什么?或者我该怎么做才能在故事板中工作? 感谢

7 个答案:

答案 0 :(得分:48)

我的解决方案是: 从故事板中打开一个新窗口并将其最小化。所以它保留在RAM中,不会重新加载。使用故事板现在可以快速轻松地完成。

答案 1 :(得分:42)

我在使用企业应用程序时遇到了同样的问题。在项目中,我在一个故事板中只有一个storyboard和所有视图。打开故事板导致Xcode变得非常慢。

所以我将故事板分成多个故事板作为模块方式,并为每个模块加载一个单独的故事板,如下面的代码所示:

如果我想推送一个视图控制器:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"storyboardName" 
                                                     bundle:nil];
UIViewController *viewController = 
 [storyboard instantiateViewControllerWithIdentifier:@"Members_ViewController"];

[self.navigationController pushViewController:viewController animated:YES];

答案 2 :(得分:8)

我们遇到了同样的问题,通常建议的性能调整没有帮助。在带有SSD的MacBook Pro上,我在故事板视图中看到CPU利用率达到80-90%,导航滞后非常令人沮丧。模拟器可能需要一分钟才能显示,Xcode通常不会关闭,需要强制退出。

如果没有查看故事板,或者如故事板作为源代码打开,这些症状都会消失。

更新:我们将项目拆分为多个故事板,生活再次良好 - CPU利用率恢复到个位数,性能与Xcode 4.6.3相当。大型故事板肯定存在问题;对流程中代码的唯一更改是将对主故事板的引用更新为storyboardWithName调用。

我们项目中的一个视图控制器有一个容器视图,当控制器及其容器视图被移动到一个单独的故事板时,似乎停止了利用率问题。这可能是巧合,为了保持一致性,我们分解了故事板的其余部分,但如果我再次处理这个问题,我首先将任何带有容器视图的视图控制器移动到一个单独的故事板。 < / p>

答案 3 :(得分:7)

如果您使用的是Xcode 7,故事板参考是创建多个故事板的快捷方式,肯定会有助于解决此问题。使用Storyboard References的好处是它不涉及任何额外的代码!有关如何设置的完整说明,请参阅下面的stackoverflow链接。

enter image description here https://stackoverflow.com/a/30772789/3316842

答案 4 :(得分:2)

我面临同样的问题。非常令人沮丧。我的故事板只有41个视图。我正在以2.3Ghz运行Mac Min i7。故事板打开后,需要很长时间才能完成非常简单的任务,例如移动UILABEL?然后,在对应视图中,编辑代码就像回到ZX81上一样。这一切都非常好,很好地敲打了故事板中的“智能”,但不以牺牲开发效率为代价。就故事板“大小”指南而言,我永远不会记得阅读故事板必须超出一定规模。也许我需要阅读更多内容。

要进行所需的更改,即拆分故事板,在几个故事板上拍一些VC,需要一点点。我想如果这是新的最佳实践,那很好。但我能做的不仅仅是推测。

答案 5 :(得分:1)

我也同意在多个故事板上组织你的观点。 当您有一个从其他几个视图调用的视图时,它变得非常方便。然后故事板可能变得像意大利面,不清楚。 在我的情况下,我有一个可以从几个视图调用的摄像机视图,我把它放在一个新的故事板上,这很好用。由于摄像机视图也指向搜索顺序视图,因此我必须将搜索顺序视图也放在单独的故事板上。我的主要故事板再次变得更简单。

所以有一个主要的故事板,并尽可能多地分开到单独的故事板上。我制作了一个通用类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];
}

答案 6 :(得分:-1)

我想补充一点,当我使用带有导航控制器的容器视图时,我的故事板响应很慢。我甚至尝试将它放在自己的故事板中,它仍然是如此之慢,我甚至无法使用它。似乎when容器视图调整了导航控制器的大小,导航栏导致了问题。

我能够通过在故事板中选择导航控制器来解决这个问题,通过取消选中隐藏导航栏&#34;显示导航栏&#34;在属性检查器中并使用&#34; isNavigationBarHidden = false&#34;在我的视图控制器类的viewDidLoad或viewWillAppear中。