2010-09-23 3 views
8

Die Apple documentation gibt folgende Warnung bezüglich der Verwendung von View Controllern zur Verwaltung eines Bildschirmbereichs.Wie macht Apple seine Controller mit anderen Controllern?

Hinweis: Sie sollten nicht Ansicht -Controller verwenden, um Ansichten zu verwalten, die nur einen Teil ihrer Fenster die nur einen Teil der von der Anwendung Inhalt Rechteck definierten Bereich ist, zu füllen. Wenn Sie eine Schnittstelle bestehend aus mehrere kleinere Ansichten haben möchten, betten Sie sie alle in einer einzigen Stammansicht ein und verwalten Sie diese Ansicht mit Ihrem View-Controller.

Jetzt ist das Merkwürdige, dass Apple diesen Rat bricht. UITabBarController, UINavigationController, UISplitViewController gehen alle gegen diesen Ratschlag. Es gibt eine Diskussion über die Apple forums über was kann schief gehen, wenn Sie diesen Rat ignorieren.

Ich fand eine tutorial auf, wie man das macht, aber die Methode hatte ein Problem mit overlapping the status bar, die eine Lösung hatte, die eine Art zwielichtig schien. Andere Fragen haben solutions that appear kind of dodgy oder advise against doing it.

Also die Frage ist, welche Methode verwendet Apple für seine eigenen Controller?

+0

Können Sie bitte den Link zur Referenz posten? Ich erstelle immer einen ViewController für kleine Ansichten, obwohl sie den Bildschirm ausfüllen oder nicht ausfüllen. Möchten Sie die Konsequenzen und gute Praxis überprüfen, bitte den Link posten. . . –

+0

@Raj: Ich habe oben auf meiner Frage einen Link hinzugefügt – Casebash

Antwort

4

Sie sagen auch, keine Autorelease-Pools zu verwenden, aber es gibt autorelease Anweisungen in ihren Beispielen. Bleib bei dem, was praktisch ist. Reinheit sollte wahrscheinlich etwas sekundär sein.

3

Apple schrieb UIKit, damit sie machen können, was sie wollen.

eine Menge Sachen gibt es unter der Haube passiert:

  • Ansicht {Will, Hat} {Auftritt, Disappear}
  • Ansicht Rotationen (igitt, Kopfschmerzen)
  • UIViewControllerWrapperView, die manchmal ist die Übergeordnetes von UIViewController.view. Oder so.
  • UIViewController.navigationController/tabBarController/parentViewController/modalViewController
  • Popovers sind seltsam. Ich bin mir nicht sicher, wie sie passen.

Wenn Sie Ihre eigenen Ansichten zu schreiben, können Sie wahrscheinlich mit der Verwendung von UIViewController weg, um sie zu kontrollieren, aber nicht erwarten, dass alle magischen Verhalten, das UIKit gibt zu ein "richtiger" View-Controller.

EDIT: Ich sollte wahrscheinlich nicht StackOverflow, wenn es zu spät ist. Ich meine wirklich etwas in der Art:

Wenn eine Ansicht von einem UIViewController gesteuert wird, sollte der View-Controller in der View-Controller-Hierarchie existieren (d. H. Funktionen wie presentModalViewController:animated:). Dies ermöglicht es UIKit, die komplizierten Bits zu handhaben.

Wenn Sie etwas wie [fooSubview addSubview:viewController.view] verwenden, kann UIKit nicht all die Dinge tun, die es tun soll. Was behält viewController? Was passiert, wenn es eine Speicherwarnung gibt und fooSubview entladen wird?

Wenn Sie etwas wie viewController.view.frame = (CGRect){{0,0},{320,480}} einstellen, fragen Sie auch nach Problemen: UIViewController setzt den Rahmen abhängig von der aktuellen Status/Navigation/Registerkarte/etc-Leiste.Es könnte es neu einstellen, oder es könnte den Rahmen verwenden, um zu entscheiden, wie View-Controller angeordnet werden, die Sie an die Spitze schieben (ich habe dieses Verhalten bemerkt; es ist chaotisch). Wenn Sie viewController.view.transform ändern, können seltsame Dinge bei View-Rotationen auftreten, da die View-Transformation für die Orientierung von UIViewController verwendet wird (zusammen mit der Statusleiste und einem Stapel anderer Dinge).

Es gibt nur eine gut unterstützte Ausnahme, die ich kenne:

[window addSubview:viewController.view]; 
[window makeKeyAndVisible]; 

(In der Tat, Sie viewController.view in einer voll-Fenster-Ansicht in dem Fenster kleben können, ich bin nicht sicher, wie das funktioniert .)

Ich denke, in OS 4.0 und höher sollten Sie stattdessen window.rootViewController = viewController setzen.

+0

Apples Controller arbeiten mit jeder Ansicht – Casebash

Verwandte Themen