51 votes

self.window.rootViewController vs window addSubview

J'ai remarqué beaucoup d'exemples d'applications iPhone dans le délégué d'application.

- (void)applicationDidFinishLaunching:(UIApplication *)application

ont

[window addSubview: someController.view]; (1)

à l'opposé de

self.window.rootViewController = self.someController; (2)

Y a-t-il une raison pratique d'utiliser l'un plutôt que l'autre ? L'un est-il techniquement correct ? Les contrôleurs ont-ils une commande équivalente au numéro (2) comme

self.someController.rootController = self.someOtherController; // pseudocode

51voto

TomSwift Points 22012

El UIWindow rootViewController est une nouveauté d'iOS4.

L'ancienne technique consistait à utiliser addSubview .

La nouvelle technique recommandée consiste à mettre rootViewController .

10voto

jaseelder Points 674

Juste une mise à jour sur ce sujet avec la sortie de ios 6.

Si vous utilisez toujours le modèle passe-partout -[UIWindow addsubview :], vous obtiendrez probablement le message "Application Windows are expected to have a Root view controller at the end of application launch" dans votre console également maintenant. Ainsi que des problèmes potentiels de rotation et de mise en page dans votre application.

Le paramétrage du rootViewController de la fenêtre comme ci-dessus résoudra également ce problème.

5voto

Ron Points 936

J'utilise ce code :

    rootViewController_ = [[RootViewController alloc] initWithFrame:[UIScreen mainScreen].bounds];
    window_ = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    if ([window_ respondsToSelector:@selector(setRootViewController:)]) { // >= ios4.0
        [window_ setRootViewController:rootViewController_];
    } else { // < ios4.0
        [window_ addSubview:rootViewController_.view];
    }

1voto

aelam Points 566

Mon opinion :

self.window.rootViewController redimensionnera la vue du rootViewController en fonction de la hauteur de la barre d'état.

Mais si vous utilisez addSubview, ce ne sera pas le cas.

Par exemple, si vous définissezRootViewController sur un NavigationController, le NavigationController serait (0,0,320,480) ;

mais si vous définissezRootViewController à un UIViewController commun, le contrôleur de navigation serait (0,0,320,460) ;

si vous utilisez addSubview : les deux viewcontrollers seraient (0,0,320,480)

Et s'il y a une In-call-StatusBar, elle change aussi pour vous lorsque vous utilisez setRoot... Si vous utilisez addSubview, la taille de la sous-vue ne changera pas.

faites quelques tests avec différentes couleurs de bordure de vue

-1voto

PJR Points 6126

Le crash est dû au fait que vous appelez une méthode qui n'existe pas, et non pas au fait que vos variables ne sont pas initialisées.

-setRootViewController n'existe pas avant iOS 4.0. Utilisez

[self.window addSubview:self.tabBarController.view]; à la place.

Ou bien, mettez à jour votre plateforme cible en 4.0.2 ou plus. Il y a probablement moins de 5% des utilisateurs qui n'utilisent pas iOS 4 à ce stade.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X