it-swarm.com.de

Zu viele Ansichten im Storyboard - Xcode läuft langsam

Ich helfe jemandem mit einem Xcode-Projekt, aber es ist fast unmöglich. Sie haben rund 100 View-Controller in ihrem Storyboard und es läuft nur sehr langsam. Ich habe alle Anleitungen befolgt, um Xcode schneller zu machen, aber sie helfen in dieser Situation einfach nicht. Außerhalb dieses Storyboards, wenn wir in den .h- und .m-Dateien arbeiten, läuft es einwandfrei. Im Storyboard läuft es langsam. Hat jemand Erfahrung mit einem solchen Projekt gemacht? Was hast du gemacht? Oder was kann ich tun, um im Storyboard arbeiten zu können? Danke

32
BrownEye

Das gleiche Problem hatte ich, als ich an einer Enterprise-App arbeitete. Im Projekt hatte ich nur eine storyboard und alle Ansichten in einem einzigen Storyboard. Beim Öffnen des Storyboards wurde Xcode sehr langsam.

Also habe ich das Storyboard modulweise in mehrere Storyboards unterteilt und ein separates Storyboard wie im folgenden Code pro Modul geladen:

Wenn ich einen View Controller schieben möchte:

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

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

Meine Lösung ist: Öffne ein neues Fenster aus dem Storyboard und minimiere es. Es bleibt also in RAM und wird nicht neu geladen. Die Arbeit mit dem Storyboard ist jetzt schnell und einfach.

48
redestructa

Wir haben das gleiche Problem, und allgemein empfohlene Leistungsverbesserungen haben nicht geholfen. Bei einem MacBook Pro mit SSD sehe ich, dass die CPU-Auslastung auf 80-90% sinkt, wenn die Storyboard-Ansicht und die Navigationsverzögerung äußerst frustrierend sind. Es kann bis zu einer Minute dauern, bis der Simulator angezeigt wird, und Xcode lässt sich häufig nicht schließen.

Diese Symptome verschwinden alle, wenn das Storyboard nicht angezeigt wird oder wenn das Storyboard als Quellcode geöffnet ist.

UPDATE: Wir teilen unser Projekt in mehrere Storyboards auf und das Leben ist wieder gut - Die CPU-Auslastung ist wieder im einstelligen Bereich und die Leistung entspricht Xcode 4.6.3. Es gibt definitiv ein Problem mit größeren Storyboards. Die einzige an unserem Code vorgenommene Änderung bestand darin, stattdessen Verweise auf das Haupt-Storyboard zu einem StoryboardWithName-Aufruf zu aktualisieren.

Einer der Ansichtscontroller in unserem Projekt verfügt über eine Containeransicht. Es hat den Anschein, dass das Auslastungsproblem gestoppt wurde, als der Controller und seine Containeransicht in ein separates Storyboard verschoben wurden. Es war vielleicht ein Zufall, und wir haben den Rest des Storyboards aus Gründen der Konsistenz aufgelöst. Wenn ich mich jedoch noch einmal mit diesem Problem beschäftigen würde, würde ich zunächst alle Ansichtscontroller mit Containeransichten in ein separates Storyboard verschieben.

8
Craig LaHote

Wenn Sie Xcode 7 verwenden, sind Storyboard-Referenzen eine schnelle Möglichkeit, mehrere Storyboards zu erstellen, und werden dieses Problem auf jeden Fall unterstützen. Die großartige Seite bei der Verwendung von Storyboard-Referenzen ist, dass es keinerlei zusätzlichen Code gibt! Eine vollständige Beschreibung zum Einrichten des Links finden Sie unter dem Stackoverflow-Link. 

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

6
baskInEminence

Ich habe das gleiche Problem. Massiv frustrierend. Mein Storyboard hat nur 41 Ansichten. Und ich habe einen Mac Min i7 mit 2,3 GHz. Wenn das Storyboard geöffnet ist, dauert es sehr lange, um sehr einfache Aufgaben wie das Verschieben eines UILABELs auszuführen. In der Gegenansicht ist das Editieren von Code so, als wäre man wieder auf einem ZX81. Es ist alles sehr gut und gute "Intelligenz" in das Storyboard zu schlagen, aber nicht auf Kosten der Entwicklungseffizienz. In Bezug auf die "Größen" -Richtlinien für Storyboards kann ich mich nie daran erinnern, dass Storyboards über eine bestimmte Größe hinaus getrennt werden müssen. Vielleicht muss ich mehr lesen. 

Um die erforderlichen Änderungen vorzunehmen, d. H. Das Storyboard aufzuteilen, einige VCs auf mehrere Storyboards zu schlagen, ist ein wenig Faff erforderlich. Ich denke, wenn das die neue Best-Practice ist, ist das gut. Aber ich könnte mit mehr als nur Vermutungen auskommen.

2
Carl Hine

Ich bin auch damit einverstanden, dass Sie Ihre Ansichten über mehrere Storyboards hinweg organisieren ... Es ist sehr praktisch, wenn Sie eine Ansicht haben, die aus mehreren anderen Ansichten aufgerufen wird. Dann kann das Storyboard wie Pasta werden, unklar ... In meinem Fall hatte ich eine Kameraansicht, die aus verschiedenen Ansichten aufgerufen werden konnte. Da die Kameraansicht auch auf die Suchauftragsansicht zeigte, musste ich die Suchauftragsansicht auch auf ein separates Storyboard legen. Wieder wurde mein Haupt-Storyboard einfacher.

Besitze also ein Haupt-Storyboard und trenne so viel wie möglich auf separate Storyboards. Ich habe eine allgemeine Klasse StoryBoardNavigation erstellt, in der ich alle Funktionen zum Aufruf von untergeordneten Storyboards zentralisiert habe.

Hier ist ein Beispiel dafür:

Diese Funktion navigiert zum Storyboard mit dem Namen OrderLookupStoryboard und öffnet die Ansicht an der Startposition.

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

}

Diese Funktion übergibt dem Storyboard einige Parameter.

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

}

Diese Funktion öffnet die Ansicht im Modulübergangsstil:

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