web-dev-qa-db-fra.com

Trop de vues dans le storyboard - Xcode tournant lentement

J'aide quelqu'un avec un projet xcode mais c'est presque impossible. Ils ont environ 100 contrôleurs View sur leur scénarimage et le temps est très lent. J'ai suivi tous les guides pour rendre Xcode plus rapide, mais ils ne nous aident pas dans cette situation. En dehors de ce story-board, lorsque nous travaillons dans les fichiers .h et .m, tout fonctionne parfaitement, c’est juste à l’intérieur du storyboard qu’il fonctionne lentement. Quelqu'un at-il déjà expérimenté un projet de ce type? Qu'est-ce que tu as fait? Ou que puis-je faire pour qu'il soit possible de travailler dans le storyboard? Merci

32
BrownEye

J'ai rencontré le même problème lorsque je travaillais sur une application d'entreprise. Dans le projet, je n'avais qu'une storyboard et toutes les vues dans un seul story-board. En ouvrant le storyboard, Xcode est devenu très lent.

J'ai donc divisé le storyboard en plusieurs storyboards en tant que module et chargé un storyboard séparé par module, comme dans le code ci-dessous:

Si je veux pousser un contrôleur de vue:

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

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

Ma solution est la suivante: Ouvrez une nouvelle fenêtre à partir du Storyboard et réduisez-la au minimum. Donc, il reste dans RAM et ne rechargera pas. Travailler avec le storyboard se maintient rapidement et facilement.

48
redestructa

Nous avons le même problème et les réglages de performances généralement recommandés n'ont pas aidé. Sur un MacBook Pro avec SSD, l'utilisation du processeur va de 80 à 90% lorsque l'affichage en storyboard et le décalage de navigation sont incroyablement frustrants. L'affichage du simulateur peut prendre jusqu'à une minute et souvent, Xcode ne se ferme pas, ce qui nécessite une fermeture forcée.

Ces symptômes disparaissent tous si vous ne visualisez pas le storyboard ou si le storyboard est ouvert en tant que code source.

MISE À JOUR: Nous avons scindé notre projet en plusieurs story-boards, et la vie est redevenue bonne - l’utilisation de la CPU est revenue à un chiffre et les performances sont équivalentes à celles de Xcode 4.6.3. Il y a certainement un problème avec les plus grands scénarimages; la seule modification apportée à notre code au cours du processus a été la mise à jour des références au storyboard principal en un appel storyboardWithName.

L'un des contrôleurs de vue de notre projet a une vue de conteneur et il est apparu que le problème d'utilisation s'était arrêté lorsque ce contrôleur et sa vue de conteneur ont été déplacés vers un storyboard séparé. C’était peut-être une coïncidence, et nous avons séparé le reste du scénario pour des raisons de cohérence, mais si je traitais de nouveau de cette question, je déplacerais d’abord les contrôleurs de vue avec des vues de conteneur dans un scénario séparé.

8
Craig LaHote

Si vous utilisez Xcode 7, les références de scénarimage sont un moyen rapide de créer plusieurs scénarimages et aideront certainement à résoudre ce problème. L’avantage de l’utilisation de Storyboard References est qu’il n’implique aucun code supplémentaire! Voir le lien stackoverflow ci-dessous pour une description complète sur la façon de le configurer. 

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

6
baskInEminence

Je suis confronté au même problème. Massivement frustrant. Mon storyboard n'a que 41 vues. Et j'utilise un Mac Min i7 sous 2.3Ghz. Avec le storyboard ouvert, il faut des siècles pour effectuer des tâches très simples, comme déplacer un UILABEL? Ensuite, en mode homologue, éditer du code revient à revenir sur un ZX81. C'est très bien et bien de taper "l'intelligence" dans le scénarimage, mais pas au détriment de l'efficacité du développement. En ce qui concerne les directives de "taille" de storyboard, je ne me souviens jamais de lire que les storyboards doivent être divisés au-delà d'une certaine taille. J'ai peut-être besoin de lire plus. 

Pour effectuer les modifications requises, c’est-à-dire séparer le scénario, lier des VC sur plusieurs scénarios, nécessitera un peu de travail. Je suppose que si c'est la nouvelle meilleure pratique, très bien. Mais je pourrais faire plus que des conjectures.

2
Carl Hine

Je suis également d'accord avec l'organisation de vos points de vue sur plusieurs story-boards .. Cela devient très pratique lorsque vous avez un point de vue appelé de plusieurs autres points de vue. Ensuite, le story-board peut ressembler à des pâtes, ce qui est peu clair… .. Dans mon cas, j'avais une vue de caméra que l'on pouvait appeler de plusieurs vues, je l'ai mise sur un nouveau story-board et cela fonctionne très bien. Étant donné que la vue de la caméra pointait également vers la vue de l'ordre de recherche, je devais également placer la vue de l'ordre de recherche sur un scénario séparé. Encore une fois, mon story-board est devenu plus simple.

Donc, ayez un story-board principal et séparez-en autant que vous le pouvez sur des story-boards séparés. J'ai fait un cours général StoryBoardNavigation où j'ai centralisé toutes les fonctions pour appeler des storyboards pour enfants.

Voici un exemple de ceci:

Cette fonction accède au storyboard appelé OrderLookupStoryboard et ouvre la vue en position de départ.

+(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];

}

Cette fonction transmet certains paramètres au storyboard.

+(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];

}

Cette fonction ouvre la vue dans le style de transition de module:

+(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