2013-04-11 3 views
2

Ce que je fais est la suivante:Instancier manuellement ViewController et appuyez sur le haut. Bonnes pratiques?

UIViewController *rootController = [[[UIApplication sharedApplication] keyWindow] rootViewController]; 
AlarmRingViewController *alarmController = [[AlarmRingViewController alloc] init]; 
[rootController presentViewController:alarmController animated:YES]; 

Ce que je veux achive avec cela, est de pousser mon AlarmRingViewController au-dessus de tout autre contrôleur qui affiche au moment et cela fonctionne jusqu'à présent.

Maintenant im me demandais si cela est une bonne pratique:

  • à instatiate un nouveau viewController chaque fois qu'il devrait être présenté
  • le font dans une classe non liées à l'interface utilisateur? (Dans mon cas un programmateur pour NSTimer)
  • à partir de là pousser le nouveau viewController avec le RootViewController sur

Ou est-ce violer le modèle MVC ou des lignes directrices ou quoi que ce soit des pommes. acclamations

Répondre

1

Personnellement, je pense que c'est le code moche. C'est difficile à lire et difficile à déboguer. Diviser un peu le code:

UIViewController *rootController = [[[UIApplication sharedApplication] keyWindow] rootViewController]; 
AlarmRingViewController *alarmController = [[AlarmRingViewController alloc] init]; 
[rootController presentViewController:alarmController animated:YES]; 

Il n'y a aucun avantage à taper autant en une ligne.

Mise à jour: Sur la base de votre question mise à jour:

Il n'y a pas de problème instanciation d'une nouvelle vue contrôleur chaque fois que vous en avez besoin. C'est très commun. Il pourrait être approprié d'en créer un et de le mettre en cache. C'est une optimisation qui pourrait avoir un sens si seulement un des contrôleurs de vue est affiché à la fois, le contrôleur de vue est utilisé très souvent, et il faut beaucoup de temps pour créer.

Les contrôleurs de vue sont généralement créés et présentés par d'autres contrôleurs (vue). Pourquoi n'utilisez-vous pas simplement un contrôleur UINavigationController en tant que contrôleur de vue racine?

+0

Oui, vous avez raison, style de code moche, mais j'avais d'autres préoccupations. voir la question mise à jour. (utilisé votre code maintenant) –

+0

J'ai mis à jour ma réponse. – rmaddy

+0

Pour être clair, vous ne voyez pas de problème à interférer avec le flux de l'interface utilisateur comme cela à partir d'une classe de contrôleur et en le poussant sur ontop? –

0

De cette façon, vous pouvez simplement faire ceci:

AlarmRingViewController *alarmController = [[AlarmRingViewController alloc] init]; 
[self.navigationController presentViewController:alarmController animated:YES completion:nil];