11

我在 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

4 回答 4

7

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

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

我注意到如果我禁用情节提要的“自动布局”,滞后将完全消失。我恢复了这个更改,然后按照以下过程: -删除一个 ViewController -测试它是否仍然滞后 -如果仍然滞后恢复更改

最终我找到了一个 ViewController,如果删除它就会停止所有延迟。然后我恢复了这个并浏览了视图,看看哪个视图导致了延迟。我最终将其缩小到“UIBarButtonItem”内的“UIButton”。我相信我更改了按钮上的“类型”属性,然后将其更改回来并且延迟停止了。从 SVN 看来,.storyboard 文件中的框架已更改。在此之后,延迟再也没有回来。

TLDR:情节提要滞后并不总是因为情节提要中有太多项目。通过让 Xcode 重新做一些布局,我设法摆脱了滞后问题。

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

于 2015-08-17T14:54:18.527 回答
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 -故事板/

于 2014-10-30T11:48:40.977 回答
3

一个 Storyboard 中的 150 个 ViewController 对我来说听起来很糟糕。如果您真的需要这么多故事板,请尽量减少您的流程或拆分为多个故事板

于 2012-08-13T07:14:11.060 回答
1

我有一个UIStoryboard10 或更多UIViewControllers和额外ContainerViews的 . 在布局视图和自定义越来越多之后,UIStoryboard变得越来越懒惰。

我的方法是在 single 中设置视图UIStoryboards。加载控制器是在我的菜单中完成的,在那里我设置了一个NSArray带有所有标识符的UIViewController,也必须在里面设置UIStoryboard

在此处输入图像描述

加载菜单时,我循环访问NSArrayUIViewControllers从特定的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];
}

就我而言,在将首字母UINavigationController与我的UIViewControllers. 如果没有 initial ,segues 不会推送到 navigationController UINavigationController。这就是为什么我UINavigationController在每个UIViewController(我的 NSArray)上添加了一个,以便UIStoryboardSegue正确完成。UINavigationController也不需要连接到类,只需将其包含在 中并将UIStoryboard其连接到第一个UIViewController

于 2015-03-26T12:33:26.760 回答