J'ai un storyboard configuré avec une connexion fonctionnelle et un contrôleur de vue principal, ce dernier est le contrôleur de vue vers lequel l'utilisateur est dirigé lorsque la connexion est réussie. Mon objectif est d'afficher immédiatement le contrôleur de vue principal si l'authentification (stockée dans le trousseau) est réussie, et d'afficher le contrôleur de vue de connexion si l'authentification a échoué. Fondamentalement, je veux faire cela dans mon AppDelegate:
// url request & response work fine, assume success is a BOOL here
// that indicates whether login was successful or not
if (success) {
// 'push' main view controller
} else {
// 'push' login view controller
}
Je connais la méthode performSegueWithIdentifier: mais cette méthode est une méthode d'instance de UIViewController, donc non appelable depuis AppDelegate. Comment puis-je faire cela en utilisant mon storyboard existant?
ÉDITER:
Le contrôleur de vue initial du Storyboard est maintenant un contrôleur de navigation qui n'est connecté à rien. J'ai utilisé le setRootViewController: distinction car MainIdentifier est un UITabBarController. Alors voici à quoi ressemblent mes lignes:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
BOOL isLoggedIn = ...; // got from server response
NSString *segueId = isLoggedIn ? @"MainIdentifier" : @"LoginIdentifier";
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
UIViewController *initViewController = [storyboard instantiateViewControllerWithIdentifier:segueId];
if (isLoggedIn) {
[self.window setRootViewController:initViewController];
} else {
[(UINavigationController *)self.window.rootViewController pushViewController:initViewController animated:NO];
}
return YES;
}
Les suggestions / améliorations sont les bienvenues!
[[self window] makeKeyAndVisible]
application: didFinishLaunchingWithOptions: avant d'essayer d'effectuer les séquences conditionnelles. UIApplicationMain () est supposé envoyer un message à makeKeyAndVisible mais ne le fait qu'après didFinish ... Options: se termine. Recherchez «Coordination des efforts entre les contrôleurs de vue» dans la documentation Apple pour plus de détails.Je suis surpris de certaines des solutions proposées ici.
Il n'y a vraiment pas besoin de contrôleurs de navigation factices dans votre storyboard, de masquer les vues et de déclencher des segues sur viewDidAppear: ou tout autre hacks.
Si vous n'avez pas configuré le storyboard dans votre fichier plist, vous devez créer vous-même la fenêtre et le contrôleur de vue racine :
Si le storyboard est configuré dans le plist de l'application, la fenêtre et le contrôleur de vue racine seront déjà configurés par l'application de temps: didFinishLaunching: est appelée, et makeKeyAndVisible sera appelé sur la fenêtre pour vous.
Dans ce cas, c'est encore plus simple:
la source
SI le point d'entrée de votre storyboard n'est pas un
UINavigationController
:SI le point d'entrée de votre storyboard est un
UINavigationController
remplacement:avec:
la source
appHasLaunchedOnce ? secondViewControllerIdentifier : firstViewControllerIdentifier;
Dans la
application:didFinishLaunchingWithOptions
méthode de votre AppDelegate , avant lareturn YES
ligne, ajoutez:Remplacez
YourStartingViewController
par le nom de votre première classe de contrôleur de vue réelle (celle que vous ne voulez pas nécessairement voir apparaître) etYourSegueIdentifier
par le nom réel de la segue entre ce contrôleur de départ et celui sur lequel vous voulez réellement démarrer (celui qui suit la séquence ).Enveloppez ce code dans un
if
conditionnel si vous ne voulez pas toujours que cela se produise.la source
Étant donné que vous utilisez déjà un Storyboard, vous pouvez l'utiliser pour présenter à l'utilisateur MyViewController, un contrôleur personnalisé (Boiling down followben's answer un peu ).
Dans AppDelegate.m :
La chaîne transmise à instantiateViewControllerWithIdentifier fait référence à l'ID de Storyboard, qui peut être défini dans le générateur d'interface:
Enveloppez simplement ceci dans la logique au besoin.
Si vous commencez avec un UINavigationController, cependant, cette approche ne vous donnera pas de contrôles de navigation.
Pour `` sauter en avant '' à partir du point de départ d'un contrôleur de navigation configuré via le générateur d'interface, utilisez cette approche:
la source
Pourquoi ne pas avoir l'écran de connexion qui apparaît en premier, vérifier si l'utilisateur est déjà connecté et pousser l'écran suivant tout de suite? Le tout dans ViewDidLoad.
la source
Mise en œuvre rapide de la même chose:
Si vous utilisez
UINavigationController
comme point d'entrée dans le storyboardla source
C'est la solution qui a fonctionné sous iOS7. Pour accélérer le chargement initial et ne pas effectuer de chargement inutile, j'ai un UIViewcontroller complètement vide appelé "DUMMY" dans mon fichier Storyboard. Ensuite, je peux utiliser le code suivant:
la source
Je suggère de créer un nouveau MainViewController qui est le contrôleur de vue racine du contrôleur de navigation. Pour ce faire, maintenez simplement le contrôle, puis faites glisser la connexion entre le contrôleur de navigation et MainViewController, choisissez «Relation - Contrôleur de vue racine» à partir de l'invite.
Dans MainViewController:
N'oubliez pas de créer des segments entre MainViewController avec les contrôleurs de vue Accueil et Connexion. J'espère que cela t'aides. :)
la source
Après avoir essayé de nombreuses méthodes différentes, j'ai pu résoudre ce problème avec ceci:
la source