2010-12-10 29 views
13

Encore en train de faire les choses ici. Je ne suis même pas proche, mais de toute façon .... J'ai une application TabBar créée à partir de Xcode. Cela fonctionne J'ai trois affichages d'onglets, que je sais comment manipuler, etc.Ajout d'un écran de connexion en face de l'application Cocoa Touch Tab pour IOS

Je voudrais mettre un dossier de connexion de «connexion» devant tout cela, exigeant un utilisateur de répondre à un (codé en dur pour l'instant) nom d'utilisateur et mot de passe. Si vous obtenez ce droit, alors, rendez la partie onglet, leur permettant de cliquer autour.

J'ai une autre application que j'ai écrite qui fait le nom d'utilisateur et le mot de passe, j'ai du mal à prendre la logique à partir de là, et à la mettre devant la pièce TabApplication.

Quelqu'un a des suggestions?

Répondre

17

Dans votre AppDelegate, à la fin de la méthode application didFinishLaunchingWithOptions vous verrez ceci:

[window addSubview:tabcontroller.view]; 
[window makeKeyAndVisible]; 
return YES; 

initialize simplement votre contrôleur de vue de la connexion et l'ajouter après la tabcontroller, comme ceci:

initialScreenViewController = [[InitialScreenViewController alloc] init]; 
[window addSubview:tabcontroller.view]; 
[window addSubview:initialScreenViewController.view]; 
[window makeKeyAndVisible]; 
return YES; 

En vous connectant viewcontroller, après avoir authentifié l'utilisateur, vous pouvez le cacher de la façon dont:

[self.parentViewController.view setHidden:YES]; 

qui vous permet de l'afficher à nouveau si vous disposez d'une fonction de déconnexion.

+0

Que ks je vais donner un coup de feu demain. Je suis un développeur C# normalement, donc la syntaxe et l'idéologie autour de la façon dont tout ça fonctionne se forment encore dans mon cerveau mou. Je vous remercie. –

+0

Donc, quand il se charge, la vue de l'onglet est chargé, et je vois seulement le bas de celui-ci, le LoginView est toujours «sur le dessus». Qu'est-ce que je fais mal? –

+0

Exemple de ce que je vois. https://dl.dropbox.com/u/10462461/Screen%20shot%202010-12-10%20at%208.32.15%20AM.png vous pouvez voir la barre d'onglet sous la vue de l'interface utilisateur en bas. –

2

Si vous commencez avec l'application de la barre d'onglet par défaut, vous pouvez le faire comme ceci:

  • Dans le MainWindow.xib, créez un UIView qui contient toutes les choses que vous voulez avoir sur l'écran de votre mot de passe
  • Accrochez tout ce dont vous avez besoin à IBOutlets dans AppDelegate et écrivez la méthode qui vérifie si le mot de passe est valide.
  • Dans la méthode applicationDidFinishLaunching, remplacer [window addSubview:tabBarController.view]; avec [window addSubview:/*whatever you called the view with the password stuff in it*/];
  • Si l'utilisateur entre le mot de passe correct faire:

[passView removeFromSuperview]; [window addSubview:tabBarController.view];

Et vous devriez être dans l'application barre d'onglets régulière.

16

La méthode standard est la suivante:

  • tout paquet lié à l'écran de connexion dans une vue et une sous-classe UIViewController qui gère cela.
  • Présent ce point de vue dans le délégué modalement de l'application dans application:didFinishLaunchingWithOptions: en appelant

    LoginController*loginController= ... ; // create the view controller for the login screen 
    [self.tabController presentModalViewController:loginController animated:YES]; 
    

De cette façon, l'animation entre la transition, etc. est automatiquement gérée.

Vous pouvez le fermer ultérieurement après vous être connecté avec succès.Il peut être fait à l'intérieur du LoginController par

[self.parentViewController dismissModalViewControllerAnimated:YES]; 

Cependant, je dois souvent faire une configuration supplémentaire une fois l'enregistrement en est fait. Donc, je voudrais tout d'abord dire au délégué de l'application que la connexion se fait, puis effectuez

[self.tabController dismissModalViewControllerAnimated:YES]; 

du délégué de l'application. Ensuite, je peux effectuer des tâches supplémentaires là-bas.

Pour communiquer de nouveau avec le délégué de l'application, j'utiliserais NSNotification, mais cela pourrait être un peu difficile pour vous.

Une façon qui pourrait être plus facile à comprendre (mais plus laid à mon goût) est de définir une méthode, par exemple loginDone dans le délégué de l'application. Puis, à l'intérieur du LoginViewController, vous pouvez faire

MyAppDelegate*appDelegate=[[UIApplication sharedApplication] delegate]; 
[appDelegate loginDone]; 
+0

Comment le rejeter à partir du LoginControllerView? –

+0

Est-ce que '[self.tabController dismissModalViewControllerAnimated: YES]' provient du délégué de l'application, une fois la connexion terminée. Vous pouvez faire '[self.parentViewController dissmissModalViewControllerAnimated: YES]' depuis la méthode 'LoginViewController', mais dans tous les cas, vous devez indiquer au délégué de l'application que vous avez effectué la connexion avec succès. Je préfère le rejeter du délégué de l'application. – Yuji

+0

Désolé, essayant de comprendre votre explication. Donc, dans mon LoginViewController, une fois qu'ils ont passé l'authentification, comment puis-je transmettre cet événement au délégué de l'application? Je vous remercie. –

0

Je préfère faire ce qui suit:

In App délégué de didFinishLaunchingWithOptions:

FirstViewController *viewController1 = [[FirstViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; 
SecondViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; 
ThirdViewController *viewController3 = [[ThirdViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; 

UINavigationController *navController1 = [[UINavigationController alloc] initWithRootViewController:viewController1]; 
UINavigationController *navController2 = [[UINavigationController alloc] initWithRootViewController:viewController2]; 
UINavigationController *navController3 = [[UINavigationController alloc] initWithRootViewController:viewController3]; 

self.tabBarController = [[UITabBarController alloc] init]; 
self.tabBarController.viewControllers = @[navController1, navController2, navController3]; 

LoginViewController *loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil]; 
UINavigationController *loginNavController = [[UINavigationController alloc] initWithRootViewController:loginViewController]; 

self.window.rootViewController = loginNavController; 

Ensuite, après avoir obtenu un rappel d'authentification, vous pouvez avoir quelque chose comme ça dans votre App Délégué:

- (void)setAuthenticatedState:(BOOL)authenticated 
{ 
    if (authenticated == YES) { 
     dispatch_async(dispatch_get_main_queue(), ^(){ 
      self.window.rootViewController = self.tabBarController; 
     }); 
    }else{ 
     // Stuff 
    } 
}