Changement de vue de la racine contrôleur après l'application iOS a chargé.
Afin de montrer mon écran de connexion lors de l'application des charges, et non pas après que l'utilisateur se connecte, j'ai décidé d'ajouter un objet auth dans NSUserDefaults lorsque l'utilisateur se connecte avec succès. Lorsque l'application est lancée, celle-auth paramètre est coché, et la vue-contrôleur est configuré en conséquence (si l'utilisateur est auth il va montrer un flux, si non il va montrer un écran de connexion) Dans ce dernier cas, j'ai l'app délégué réinitialiser la vue racine contrôleur de l'alimentation après que l'utilisateur a ouvert une session. Est-ce une mauvaise pratique ou est-il une meilleure manière de faire ceci?
Dans le délégué d'application:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
IIViewDeckController* deckController = [self generateControllerStack];
self.rightController = deckController.rightController;
self.centerController = deckController.centerController;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if([[defaults objectForKey:@"auth"] isEqualToNumber:[NSNumber numberWithInt:1]]){
self.window.rootViewController = deckController;
}else{
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle:nil];
UIViewController* vc = [sb instantiateViewControllerWithIdentifier:@"loginViewController"];
self.window.rootViewController = vc;
}
[self.window makeKeyAndVisible];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:NO];
return YES;
}
- (void) setRoots
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
IIViewDeckController* deckController = [self generateControllerStack];
self.rightController = deckController.rightController;
self.centerController = deckController.centerController;
self.window.rootViewController = deckController;
[self.window makeKeyAndVisible];
}
Dans le de connexion view controller:
- (IBAction)loginClick:(id)sender {
if([_emailField.text length]>0&&[_passField.text length]>0){
NSString *user = _emailField.text;
NSString *pass = _passField.text;
[[API sharedInstance] login:user andPass:pass onCompletion:^(NSDictionary *json){
NSLog(@"%@", json);
if(![json objectForKey:@"error"]){
[API sharedInstance].authorized = 1;
NSNumber *auth = [NSNumber numberWithInt:1];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:auth forKey:@"auth"];
[defaults synchronize];
captureYouAppDelegate *app = [[UIApplication sharedApplication] delegate];
[app setRoots];
}else{
[API sharedInstance].authorized = 0;
}
}];
}else{
if([_emailField.text length]<1){
[_emailField becomeFirstResponder];
}else{
[_passField becomeFirstResponder];
}
}
}
Je me demandais si il est mieux ou plus facile façon de le faire. Merci!!!!
UINavigationController
comme rootViewController
, et que vous ne poussez pas l'écran de connexion dans la pile de navigation si l'utilisateur est déjà connecté. il serait beaucoup plus facile et beaucoup plus élégante que votre solution actuelle est.Si la barre d'onglets est également nécessaire après la connexion, l'ajout d'un UINavigationController ne serait pas une option, un droit?
OriginalL'auteur Misbah Khan | 2013-08-14
Vous devez vous connecter pour publier un commentaire.
Juste pour clarifier. J'ai dû réinitialiser UIWindow de rootViewController avant sans aucun problème, mais lorsque vous tentez de le faire tout en permettant à l'appareil de rotation j'ai rencontré quelques problèmes de Rotation de l'arrêté de fonctionner.
J'ai trouvé le suivant directement auprès d'Apple docs, tout en essayant de débogage. Le lien ci-dessous a un certain nombre de lignes directrices sur le travail avec les UIWindow. Ce sont tous liés à un dispositif de rotation, mais toujours bon à savoir.
Réponse courte, l'utilisation d'une racine contrôleur et ajouter de l'enfant de voir les contrôleurs. Vous pouvez ensuite échanger l'enfant VCs a pas de problème.
Vérifier cette technique Q&A pour plus de détails.
OriginalL'auteur WCByrne
Je ne pense pas que réinitialiser le
window.rootViewController
est une mauvaise pratique. Cependant, il n'est pas nécessaire de recréer une fenêtre.Si vous ne voulez pas utiliser l'ancienne-vue-contrôleur, il suffit de remplacer la fenêtre
rootViewController
avec le nouveau-vue-contrôleur. Si vous ne souhaitez revenir à votre ancienne-vue-contrôleur, utilisez-presentViewController: animated: completion:
de présenter votre point de vue contrôleur peut être une meilleure alternative.Je suis d'accord avec elle, la modification de la rootViewController au cours de l'exécution est un très mauvais code-modèle.
Pourriez-vous expliquer pourquoi c'est une mauvaise code-modèle? thx!
Avez-vous une suggestion sur la façon de libérer la précédente rootViewController si je n'ai jamais besoin? thx!
littéralement il n'est pas une situation qui exige le développeur de changer la
rootViewController
au cours de l'exécution, littéralement tout ce qui peut être fait sans toucher à laUIWindow
. d'autre part, quant au fait qu'il avait été défini lors du lancement, et selon le cycle de vie des applications de la logique de l'application ne devrait pas retourner à presque le début de son propre cycle de vie. cependant, il peut être fait librement, mais cette procédure indique que la couche de la vue (et à la navigation, l '"arbre") a été mal conçu.OriginalL'auteur liuyaodong
Il n'est pas nécessaire d'affecter la fenêtre de nouveau, vous pouvez directement régler ce
OriginalL'auteur Divyam shukla
Étape Par étape, je suis en train de montrer les Bonnes Pratiques pour l'utilisation de rootviewcontroller avec l'aide de UINavigationController
OriginalL'auteur ChitaRanjan Sahu