2010-09-23 4 views
8

Le Apple documentation donne l'avertissement suivant concernant l'utilisation de View Controllers pour gérer une partie d'un écran.Comment Apple fait-il que ses contrôleurs contiennent d'autres contrôleurs?

Remarque: Vous ne devriez pas utiliser la vue contrôleurs pour gérer les vues qui remplissent seulement une partie de leur fenêtre qui est seulement une partie de la zone définie par le rectangle contenu de l'application . Si vous voulez voulez avoir une interface composée de plusieurs petites vues, les incorporer tous dans une seule vue racine et gérer cette vue avec votre contrôleur de vue.

Maintenant, la chose étrange est que Apple rompt ce conseil. UITabBarController, UINavigationController, UISplitViewController tous vont à l'encontre de ce conseil. Il ya une discussion sur le Apple forums sur ce qui peut mal tourner si vous ignorez ce conseil.

J'ai trouvé un tutorial sur la façon de faire cela, mais la méthode avait un problème avec overlapping the status bar qui avait un correctif qui semblait un peu douteux. D'autres questions ont solutions that appear kind of dodgy ou advise against doing it. Donc, étant donné la question est quelle méthode Apple utilise-t-il pour ses propres contrôleurs?

+0

Pouvez-vous s'il vous plaît poster le lien vers la référence? Je crée toujours un viewController pour les petites vues malgré qu'elles remplissent ou ne remplissent pas l'écran. Voudrait vérifier les conséquences et les bonnes pratiques, s'il vous plaît poster le lien. . . –

+0

@Raj: J'ai ajouté un lien en haut de ma question – Casebash

Répondre

4

Ils disent également de ne pas utiliser les pools de libération automatique, mais il y a autorelease des énoncés dans leurs échantillons. Stick avec ce qui est pratique. La pureté devrait probablement être légèrement secondaire.

3

Apple a écrit UIKit pour pouvoir faire ce qu'il veut.

Il y a beaucoup de choses qui se passe sous le capot:

  • vue {Will, est-ce} {Apparaître, Disappear}
  • rotations de vue (ugh, maux de tête)
  • UIViewControllerWrapperView, ce qui est parfois le parent de UIViewController.view. Ou quelque chose.
  • UIViewController.navigationController/tabBarController/parentViewController/modalViewController
  • Les popovers sont étranges. Je ne sais pas comment ils se situent dans.

Si vous écrivez votre propre point de vue, vous pouvez probablement vous en sortir avec l'aide UIViewController pour les contrôler , mais ne vous attendez pas tout le comportement magique qui donne à UIKit un "bon" contrôleur de vue.

EDIT: Je ne devrais probablement pas StackOverflow lorsqu'il est en retard. Je veux vraiment dire quelque chose comme ceci:

Si une vue est contrôlée par un UIViewController, le contrôleur de vue doit exister dans la hiérarchie du contrôleur de vue (c'est-à-dire fonctionner comme presentModalViewController:animated:). Cela permet à UIKit de gérer les bits complexes. Quand vous utilisez quelque chose comme [fooSubview addSubview:viewController.view], UIKit peut ne pas faire tout ce qu'il est supposé faire. Qu'est-ce qui retient viewController? Que se passe-t-il s'il y a un avertissement de mémoire et que fooSubview est déchargé?

Si vous définissez quelque chose comme viewController.view.frame = (CGRect){{0,0},{320,480}}, vous demandez également des problèmes: UIViewController définit le cadre en fonction de la barre d'état/navigation/onglet/etc actuelle.Il peut être réinitialisé, ou il peut utiliser le cadre pour décider comment disposer les contrôleurs de vue que vous appuyez sur le dessus (j'ai remarqué ce comportement, c'est désordonné). Si vous modifiez viewController.view.transform, des choses étranges peuvent se produire sur les rotations de vue, puisque la transformation de vue est ce que UIViewController utilise pour l'orientation (avec la barre d'état et une pile d'autres choses).

Il n'y a qu'une seule exception bien pris en charge que je connaisse:

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

(En fait, vous pouvez coller viewController.view l'intérieur d'une fenêtre de vue plein dans la fenêtre, je ne sais pas comment ça fonctionne

Je pense que dans OS 4.0+, vous êtes censé définir window.rootViewController = viewController à la place.

+0

Les contrôleurs d'Apple fonctionnent avec n'importe quel point de vue – Casebash