web-dev-qa-db-ja.com

ストーリーボードのビューが多すぎる-Xcodeの実行速度が遅い

私は誰かをxcodeプロジェクトで手助けしていますが、それはほとんど不可能です。ストーリーボードに約100個のViewコントローラーがあり、実行速度が非常に遅いだけです。私はXcodeを高速化するためのすべてのガイドに従ってきましたが、それらはこの状況では役に立ちません。そのストーリーボードの外で、.hファイルと.mファイルで作業しているときは、完全に正常に実行されますが、実行速度が遅いのはストーリーボードのすぐ内側です。誰もがこのようなプロジェクトを経験したことがありますか?あなたは何をした?または、ストーリーボードで作業できるようにするにはどうすればよいですか?ありがとう

32
BrownEye

エンタープライズアプリで作業しているときにも同じ問題に直面しました。プロジェクトでは、1つのストーリーボードにstoryboardが1つとすべてのビューがありました。ストーリーボードを開くと、Xcodeが非常に遅くなりました。

そのため、ストーリーボードをモジュール単位で複数のストーリーボードに分割し、以下のコードのようにモジュールごとに個別のストーリーボードをロードしました。

ビューコントローラーをプッシュしたい場合:

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

[self.navigationController pushViewController:viewController animated:YES];
42
Nitin Gohel

私の解決策は、ストーリーボードから新しいウィンドウを開いて最小化することです。つまり、RAM=にとどまり、再ロードされません。ストーリーボードでの作業は、すばやく簡単になりました。

48
redestructa

私たちは同じ問題を抱えており、一般的に推奨されるパフォーマンスの調整は役に立ちませんでした。 SSDを搭載したMacBook Proでは、ストーリーボードビューでナビゲーションの遅れが信じられないほど苛立たしい場合、CPU使用率が80〜90%になることがわかります。シミュレーターの表示には最大1分かかる場合があり、Xcodeが終了しないことが多く、強制終了が必要です。

ストーリーボードを表示しない場合、またはストーリーボードがソースコードとして開いている場合、これらの症状はすべて消えます。

更新:私たちはプロジェクトを複数のストーリーボードに分割し、人生は再び良好です-CPU使用率は1桁に戻り、パフォーマンスはXcode 4.6.3と同等です。大きなストーリーボードには間違いなく問題があります。プロセスでコードに加えられた変更は、メインのストーリーボードへの参照を代わりにstoryboardWithName呼び出しに更新することでした。

プロジェクトのビューコントローラーの1つにコンテナービューがあり、そのコントローラーとそのコンテナービューが別のストーリーボードに移動されたときに使用率の問題が停止したようです。偶然の可能性があり、別れました一貫性を保つためにストーリーボードの残りの部分ですが、この問題に再度対処する場合は、最初にコンテナービューを持つビューコントローラーを別のストーリーボードに移動します。

8
Craig LaHote

Xcode 7を使用している場合、ストーリーボード参照は複数のストーリーボードをすばやく作成する方法であり、この問題を確実に解決します。 Storyboard Referencesを使用することの優れた点は、余分なコードを一切含まないことです。設定方法の詳細については、以下のstackoverflowリンクを参照してください。

enter image description herehttps://stackoverflow.com/a/30772789/3316842

7
baskInEminence

私も同じ問題に直面しています。大いにイライラする。私のストーリーボードのビューは41しかありません。 2.3Ghzで動作するMac Min i7を実行しています。ストーリーボードが開いていると、UILABELを移動するなどの非常に単純なタスクを実行するのに時間がかかりますか?次に、対応するビューでは、コードの編集はZX81に戻ったようなものです。すべてが非常にうまく、ストーリーボードに「インテリジェンス」を取り入れることはできますが、開発効率を犠牲にすることはありません。ストーリーボードの「サイズ」ガイドラインに関する限り、ストーリーボードを特定のサイズを超えて分割する必要があることを読んだことを覚えていません。たぶんもっと読む必要があります。

必要な変更を行うには、つまりストーリーボードを分割し、いくつかのVCを複数のストーリーボードで平手打ちするには、少し手間がかかります。それが新しいベストプラクティスであると思います。しかし、私は推測以上のことができました。

2
Carl Hine

また、複数のストーリーボードにわたってビューを整理することに同意します。他のいくつかのビューから呼び出されるビューがある場合に非常に便利です。すると、ストーリーボードはパスタのようになり、不明確になります。私の場合、いくつかのビューから呼び出すことができるカメラビューがあり、これを新しいストーリーボードに配置しました。カメラビューも検索順序ビューを指しているため、別のストーリーボードにも検索順序ビューを配置する必要がありました。繰り返しになりますが、私のメインストーリーボードはシンプルになりました。

したがって、メインのストーリーボードを用意し、できるだけ多くのストーリーボードに分割します。私は一般的なクラス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];
}
1
Mark