Wie macht Apple seine Controller mit anderen Controllern?

8

In der Apple-Dokumentation wird folgende Warnung angezeigt Verwenden von View Controllern zum Verwalten eines Teils eines Bildschirms.

  

Hinweis: Sie sollten keine Ansicht verwenden   Controller zum Verwalten von Sichten, die füllen   nur ein Teil ihres Fensters - das heißt,   nur ein Teil des von der   Anwendungsinhalt Rechteck. Wenn du   möchte eine Schnittstelle aus haben   mehrere kleinere Ansichten, bette sie alle ein   in einer einzigen Stammansicht und das zu verwalten   sehen Sie mit Ihrem View-Controller.

Nun ist das Merkwürdige, dass Apple diesen Rat bricht. UITabBarController , UINavigationController , UISplitViewController gehen alle gegen diesen Ratschlag. Es gibt eine Diskussion über die Apple-Foren darüber, was schiefgehen kann, wenn Sie diesen Rat ignorieren.

>

Ich habe ein Tutorial gefunden, wie man das macht, aber die Methode hatte ein Problem mit Überlappung der Statusleiste , die eine Korrektur hatte, die nett zu sein schien von zwielichtig. Andere Fragen haben Lösungen, die eine Art zwielichtig erscheinen oder rate davon ab, dies zu tun .

Die Frage ist also, welche Methode Apple für seine eigenen Controller verwendet?

    
Casebash 23.09.2010, 01:42
quelle

2 Antworten

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.

    
Matt Williamson 23.09.2010, 03:03
quelle
3

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

Unter der Haube passiert eine Menge:

  • view {Will, Did} {Erscheinen, Verschwinden}
  • Anzeigen Rotationen (ugh, Kopfschmerzen)
  • UIViewControllerWrapperView, das manchmal das übergeordnete Element von UIViewController.view ist. Oder etwas.
  • UIViewController.navigationController / tabBarController / parentViewController / modalViewController
  • Popovers sind komisch. Ich bin mir nicht sicher, wie sie passen.

Wenn Sie eigene Ansichten schreiben, können Sie wahrscheinlich UIViewController verwenden, um sie zu steuern , aber erwarten Sie nicht das magische Verhalten, das UIKit einem "richtigen" View-Controller gibt.

BEARBEITEN: Ich sollte wahrscheinlich nicht StackOverflow, wenn es zu spät ist. Ich meine wirklich so etwas:

Wenn eine Ansicht von einem UIViewController gesteuert wird, sollte der Ansichtscontroller in der View-Controller-Hierarchie vorhanden sein (d. h. Funktionen wie presentModalViewController:animated: ). Dadurch kann UIKit die komplizierten Bits 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 / Tab / 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 der Ansichtsrotation auftreten, da UIViewController die Ansichtstransformation zur Orientierung verwendet (zusammen mit der Statusleiste und einem Stapel anderer Dinge).

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

%Vor%

(In der Tat können Sie viewController.view in einer Vollansicht innerhalb des Fensters stecken; ich bin mir nicht sicher, wie das funktioniert.)

Ich denke, in OS 4.0+ sollten Sie stattdessen window.rootViewController = viewController setzen.

    
tc. 23.09.2010 02:58
quelle