Xcode中的故事板非常慢

时间:2012-07-27 16:29:05

标签: xcode performance uiviewcontroller storyboard xcode4.4

我在Storyboard中有150个UIViewController,在这些视图之间滚动是如此之慢。我无法轻松放大和缩小,制作麦粒肿需要一些时间。

我正在使用MBPR,我安装了Xcode 4.4

规格:2.3GHz / 16G / 256,我认为这足以处理这样的事情。

是否有任何选项,设置或提示/技巧可以在故事板中拥有如此多的视图,并且不会错过性能。

注意:我已经完成了所有可能的解决方案(删除缓存和工作区)。没工作。它与Storyboard中的UIViewController数量有关。

由于

2016年更新:只是为了更新这个问题,因为Xcode 7中有一项新功能允许您将故事板重构为多个故事板。

重构故事板 https://developer.apple.com/library/ios/recipes/xcode_help-IB_storyboard/Chapters/RefactorStoryboard.html

如果您搜索术语“重构故事板”,您会找到很好的教程:)

4 个答案:

答案 0 :(得分:7)

将故事板分成许多不同的模块(每个模块都在一个单独的故事板中)被认为是最佳实践。它将消除您遇到的这些性能问题,并且还具有其他优点,例如使其更易于管理(没有大规模的SVN冲突等)。

但是我有另一个导致故事板滞后的问题。我有大约25个视图控制器,并且收到了很多滞后 - 但只有当Xcode在外部监视器上运行时。

我注意到,如果我禁用"自动布局"对于故事板,滞后将完全消失。我还原了这个更改,然后按照以下过程: - 删除ViewController - 测试是否仍然滞后 - 如果仍然滞后还原变化

最终我找到了一个ViewController,如果删除则停止所有延迟。然后我恢复了这个并浏览了一下视图,看看哪个视图导致滞后。我最终把它缩小到了一个" UIButton"在" UIBarButtonItem"内。我相信我改变了#34; Type"按钮上的属性,然后将其更改回来并停止滞后。从SVN看起来,框架在.storyboard文件中被更改了。在此之后,滞后再也没有回来了。

TLDR: 故事板滞后并不总是因为故事板中的项目太多。我设法通过使Xcode重新做一些布局来摆脱滞后问题。

希望我的经历能帮助别人诊断/解决他们的问题。我工作了大约0.5年才真正生气,并试图解决这个问题。

答案 1 :(得分:6)

绝对使用多个故事板。我不知道使用故事板有任何限制,但尝试一次渲染所有这些UI代码对您的机器来说很难,而且开发人员也很难理解。

尝试在逻辑上将您的故事板划分为以下类别:" profileSB,feedSB,mapSB,messagesSB,settingsSB"

以下是一些关于创建这些内容的好教程:
http://spin.atomicobject.com/2014/02/18/ios-storyboards-xcode5/
http://www.skillmasters.net/main/xcode-using-multiple-storyboards/

答案 2 :(得分:3)

一个故事板中的150个ViewControllers对我来说听起来很糟糕。 如果你真的需要这么多

,尽量减少你的流量或分成多个故事板

答案 3 :(得分:1)

我有一个UIStoryboard,其中包含10个或更多UIViewControllersContainerViews。在布局视图和定制越来越多之后,UIStoryboard变得越来越懒惰。

我的方法是在单UIStoryboards内设置视图。加载控制器是在我的菜单中完成的,我在其中设置NSArray,其UIViewController的所有标识符也必须在UIStoryboard内设置:

enter image description here

加载菜单时,我会遍历NSArray并按特定UIViewControllers的标识加载UIStoryboard。对于不同的UIStoryboards

,这是我需要实现切换的地方
self.arrayVCAll = [NSMutableArray new];
for ( NSArray *array in _arrayViewControllerAll ){

    NSMutableArray *arrayTemp = [NSMutableArray new];

    for (UIViewController *vc in array ){
        NSString *strViewController = [NSString stringWithFormat:@"%@", vc];
        UIStoryboard *storyboard;

        if( [strViewController isEqualToString:@"CustomOneStoryboard"] ){
            storyboard = [UIStoryboard storyboardWithName:@"FirstVC" bundle:nil];

        } else if( [strViewController isEqualToString:@"CustomTwoStoryboard"] ){
            storyboard = [UIStoryboard storyboardWithName:@"SecondVC" bundle:nil];

        } else {
            storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        }

        UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:strViewController];

        MyNavController *nav = [[MyNavController alloc] initWithRootViewController:controller];
        [arrayTemp addObject:nav];
    }

    [self.arrayVCAll addObject:arrayTemp];
}

在我的情况下,将初始UINavigationControllerUIViewControllers分开后,segues只出现了问题。如果没有初始UINavigationController,segues将不会推送到navigationController。这就是为什么我在每个UINavigationController(我的NSArray)上添加UIViewController所以UIStoryboardSegue将正确完成。 UINavigationController也不需要连接到某个类,只需将其包含在UIStoryboard中并将其连接到第一个UIViewController