2011-01-10 12 views
0

Meine App verfügt über einen Begrüßungsbildschirm, der nur im Hochformat angezeigt werden kann. Nachdem der Benutzer den Willkommensbildschirm angetippt hat, möchte ich einen anderen Bildschirm zeigen, der sowohl im Hochformat als auch im Querformat verwendet werden kann.Wie entferne ich einen View-Controller aus meiner View-Hierarchie?

Ich habe einen View-Controller einrichten, die shouldAutorotateToInterfaceOrientation:YES für UIInterfaceOrientationPortrait nur Rückkehr implementiert, und ich fügen Sie den Blick auf das Fenster mit [window addSubView:view]. Ich markiere diese Ansicht mit dem Tag 1.

Wenn der Benutzer durch die Begrüßungs Ansicht klopft und die App bewegt sich auf die neue Ansicht, die ich tun:

[[window viewWithTag:1] removeFromSuperView]; 
[window addSubView:myViewController.view]; 

Wo MyViewController ist eine Instanz der View-Controller der zweiten Ansicht (das übernimmt die shouldAutorotateToInterfceOrientation Methode richtig) .

Wenn ich jetzt rotiere, ruft es immer noch shouldAutorotateToInterfceOrientation auf dem View-Controller der ursprünglichen Ansicht auf und ruft es nicht auf dem View-Controller der neuen Ansicht auf.

This note from Apple besagt, dass nur ein View-Controller Rotationsmeldungen erhält; Ich habe jedoch den anderen View-Controller entfernt.

Was mache ich falsch?

Antwort

1

eigentlich sagt dieser Hinweis nicht, dass "nur ein View-Controller die Benachrichtigungen erhalten wird", sondern stattdessen heißt es: "Nur der erste View-Controller, der zu UIWindow hinzugefügt wird, rotiert.". Das könnte also das Problem sein.

Um es zu lösen, würde ich sagen, immer eine Ansicht zu Ihrem Fenster hinzugefügt haben (nennen Sie es dauerhaft), und fügen Sie Ihren Begrüßungsbildschirm und die nächsten Ansichten zu dieser permanenten Ansicht hinzu.

Hoffe, das hilft.

1

als Notiz, die Sie Zustand verlinken:

Nur die ersten View-Controller hinzugefügt zu UIWindow drehen.

So ein Flag gesetzt, der sicherstellt, dass shouldAutorotateToInterfceOrientation NEIN zurückgibt, bis der Benutzer den Bildschirm entlassen haben - und kehrt dann JA danach. Dies ist eine einfache und funktionierende Lösung - jedoch könnte es von einem Code-Lesbarkeitspunkt verwirrend sein, dass eine "abgewiesene" Ansicht tatsächlich die Drehung steuert.

Persönlich; Meine Erfahrung ist, dass es sich nicht wirklich lohnt, einige Ansichten rotieren zu lassen und andere nicht - und Nutzer neigen dazu, es nicht zu mögen.

glücklich Codierung

1

Ich schrieb einen schnellen Test auf, das zeigt, was Sie versuchen, funktionieren sollte zu tun. Hier sind die Grundlagen, die ich gemacht habe:

Erstellen Sie zwei View-Controller. Die App startet mit dem ersten View-Controller, der im AppDelegate über NIB-Dateien in eine Instanzvariable viewController gesetzt wird. Es wird dann wie beschrieben in das Fenster eingefügt.

Ich habe dann eine Aktion, die beim Aufruf (könnte ein Timer, Schaltfläche auf der ersten Ansicht Controller usw.)), der Folgendes ausgeführt hat:

Ansicht mit [self.viewController removeFromSuperview] entfernen. Das ist anders als das, was Sie mit dem Tag gemacht haben.

Erstellt den zweiten Ansichtscontroller und weist ihn self.viewController zu.

Hinzugefügt Fenster wie Sie angegeben haben.

Nicht sicher, was mit Ihrem Code falsch ist. Ich vermute, dass die erste Sichtweise vielleicht nicht wirklich entfernt wurde.

+0

Also nur der ursprüngliche View Controller wird jemals von Rotationen benachrichtigt? –

+0

Entschuldigung, die erste Antwort war falsch. Bearbeitete Antwort zu korrigieren. –

Verwandte Themen