AppDelegate, rootViewController et presentViewController
Je suis en train de faire le Facebook de l'intégration tutoriel, je veux montrer à mes MainViewViewController si l'utilisateur dispose d'un jeton valide pour l'état actuel sinon je veux montrer LoginViewController.
MainViewAppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded) {
//To-do, show logged in view
} else {
//No, display the login page.
[self showLoginView];
}
return YES;
}
- (void)showLoginView
{
UIStoryboard *mainstoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
LoginViewController* loginViewController = [mainstoryboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
[self.window.rootViewController presentViewController:loginViewController animated:YES completion:NULL];
}
D'erreur de la Console :
Warning: Attempt to present <LoginViewController: 0xb492fd0> on <MainViewViewController: 0xb1bd820> whose view is not in the window hierarchy!
Je ne veux pas utiliser un NavigationController.
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème. Basé sur la réponse à cette question, j'ai ajouté
[self.window makeKeyAndVisible]
juste avantpresentViewController:animated:completion:
, et qu'il fixe pour moi.Dans votre cas, showLoginView devient
Parfois présenter modal-vue-contrôleur de la fenêtre.rootViewController peut produire le même avertissement & n'ont aucun effet.
Exemple de hiérarchie de vue des contrôleurs:
Appelle maintenant
sera la cause de l'avertissement (testé à la fois sur iOS6 & 7 Sim)
Solution:
Au lieu d'utiliser rootViewController - utiliser le haut de celui présenté par:
Stepan Generalov réponse a été la bonne pour moi dans Swift 3!!!
Bien sûr, avec la nouvelle syntaxe etc. donc je vais copier ici:
"MainApp" est ma principale-vue-contrôleur de l'identifiant dans ce cas.
Je sais qu'il y a d'autres égards, mais si vous avez besoin d'avoir différents schémas d'URL pour l'ouverture de différentes parties de votre Application, vous devez le manipuler dans AppDelegate donc c'est parfait parce que dans le
méthode, vous pouvez simplement vérifier ce
url
est comme une Chaîne de caractères et de décider ensuite si vous exécutez la au-dessus de code écrit ou peut-être un similaire avec un identifiant différent pour un autre point de vue contrôleur (withIdentifier
)Dans Swift 3 :-
Dans le cas où vous n'êtes pas à l'aide d'un storyboard.
Vous devez d'abord créer YourViewController.
Allez File -> New -> Fichier... (ou le raccourci commande + N)
Après cela, choisissez Cocoa Touch Classe. Cliquez sur Suivant, ou Entrer
Que de taper un nom pour votre viewController et cliquez sur Suivant
Swift 3/4 Exemple
}