UINavigationController et UINavigationBar

Bonjour,



j'ai un petit problème à  vous soumettre. Voila, j'ai une application qui au lancement push vers un formulaire de connexion à  un webService ou sinon push vers la liste des utilitaires de mon webService si mes identifiants sont déjà  renseigné.

Pour le push vers ces deux vues voici le code source de mon AppDelegate.m:




<br />
<br />
<br />
#import &quot;AppDelegate.h&quot;<br />
#import &quot;FormulaireViewController.h&quot;<br />
#import &quot;AppViewController.h&quot;<br />
@implementation AppDelegate<br />
@synthesize window = _window;<br />
- (id) init{<br />
	if(self=[super init]){<br />
		AuthApp=[[Authentification alloc ]init];<br />
		IdentiApp=[[Identification alloc]init];<br />
	}<br />
	return self;<br />
}<br />
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions<br />
{<br />
	//démarrage de l&#39;application on initialisnt ma sandbox (Pour mes test) et appel à  la méthode loadMyDefaultViewController qui s&#39;occupera d&#39;instancier et de charger la vue adéquoite en fonction si ma sandbox est renseigné ou pas<br />
<br />
	//Initialiser ma sandbox (pour mes test)<br />
	[IdentiApp setAdresse:@&quot;&quot;];<br />
	NSLog(@&quot;l&#39;adresse stocké dans le bac a sable est le suivant: %@&quot;,[IdentiApp getAdresse]);<br />
	[IdentiApp setLogin:@&quot;&quot;];<br />
	NSLog(@&quot;le login stocké dans le bac a sable est le suivant: %@&quot;,[IdentiApp getLogin]);<br />
	[IdentiApp setPassword:@&quot;&quot;];<br />
	NSLog(@&quot;le mot de passe stocké dans le bac a sable est le suivant: %@&quot;,[IdentiApp getPassword]);<br />
	//<br />
	[NSThread sleepForTimeInterval:1];<br />
	[self loadMyDefaultViewController];<br />
  <br />
	return YES;<br />
}<br />
<br />
- (void)loadMyDefaultViewController<br />
{  <br />
	//Vérifier si les élèments de ma sandbox est initialiser à  vide ou alors si elle a conservé les identifiants d&#39;authentification de la session précédent, en fonction, la vue du formulaire ou celle de la liste des utilitaires sera instancié et push vers elle<br />
	UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;<br />
	[navigationController  setNavigationBarHidden:NO animated:NO];<br />
	navigationController.navigationBar.barStyle=UIBarStyleBlack;<br />
  <br />
	if (([[IdentiApp getAdresse] length]==0) || ([[IdentiApp getLogin] length]==0) || ([[IdentiApp getPassword] length]==0)){<br />
			[navigationController  setNavigationBarHidden:NO animated:NO];<br />
		  <br />
		UILabel * nav_title_form = [[UILabel alloc] initWithFrame:CGRectMake(115, 5, 190, 30)];<br />
		nav_title_form.font = [UIFont fontWithName:@&quot;Arial-BoldMT&quot; size:18];<br />
		nav_title_form.textColor = [UIColor whiteColor];<br />
		nav_title_form.adjustsFontSizeToFitWidth = YES;<br />
		nav_title_form.text = @&quot;Formulaire&quot;;<br />
		nav_title_form.backgroundColor = [UIColor clearColor];<br />
		[navigationController.navigationBar addSubview:nav_title_form];<br />
	  <br />
	  <br />
			FormulaireViewController *formViewController = [navigationController.storyboard instantiateViewControllerWithIdentifier:@&quot;Formulaire&quot;];<br />
			[navigationController pushViewController:formViewController animated:YES];<br />
	  <br />
		}<br />
	else {<br />
	  <br />
		BOOL testConnectionApp;<br />
		testConnectionApp=[AuthApp login:[IdentiApp getAdresse] Lelogin:[IdentiApp getLogin] Lepassword:[IdentiApp getPassword]];<br />
		NSLog(@&quot;%@&quot;,[AuthApp token]);<br />
		if(testConnectionApp==YES){<br />
		 [navigationController  setNavigationBarHidden:NO animated:NO];<br />
		  <br />
		UILabel * nav_title_utility = [[UILabel alloc] initWithFrame:CGRectMake(115, 5, 190, 30)];<br />
		nav_title_utility.font = [UIFont fontWithName:@&quot;Arial-BoldMT&quot; size:18];<br />
		nav_title_utility.textColor = [UIColor whiteColor];<br />
		nav_title_utility.adjustsFontSizeToFitWidth = YES;<br />
		nav_title_utility.text = @&quot;Utilitaires&quot;;<br />
		nav_title_utility.backgroundColor = [UIColor clearColor];<br />
		[navigationController.navigationBar addSubview:nav_title_utility];  <br />
<br />
			AppViewController *appliViewController = [navigationController.storyboard instantiateViewControllerWithIdentifier:@&quot;App&quot;];<br />
			[navigationController pushViewController:appliViewController animated:YES];<br />
	  <br />
		}<br />
  <br />
	}<br />
}<br />
	  <br />
- (void)applicationWillResignActive:(UIApplication *)application<br />
{<br />
	// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.<br />
	// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.<br />
}<br />
- (void)applicationDidEnterBackground:(UIApplication *)application<br />
{<br />
	// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.<br />
	// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.<br />
}<br />
- (void)applicationWillEnterForeground:(UIApplication *)application<br />
{<br />
	// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.<br />
}<br />
- (void)applicationDidBecomeActive:(UIApplication *)application<br />
{<br />
	// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.<br />
}<br />
- (void)applicationWillTerminate:(UIApplication *)application<br />
{<br />
	// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.<br />
}<br />
@end<br />




Donc comme vous le constatez, en plus de push vers l'une ou l'autre vue, j'affecte un label à  ma bar de navigation, qui sera un peu si vous voulez le titre de ma vue, label en fonction de tel ou tel vue.



Du coup reprenons, je lance mon application, on imagine que c'est la première fois que je l'utilise cette appli, j'arrive du coup direct à  mon formulaire, c'est parfait, j'ai mon titre qui s'affiche bien au milieu de ma bar de navigation. Je renseigne mon formulaire et j'appui sur mon bouton seConnecter (seConnecter me permet de me loguer à  mon webService et push vers la liste de mes utilitaires (L'autre vue)). Donc là  parfait, j'ai l'affichage que je veux avec le titre que je veux. Voila le code source ma classe FormViewController.m ou est définie mon Action "seConnecter":


#import &quot;FormulaireViewController.h&quot;<br />
#import &quot;Authentification.h&quot;<br />
#import &quot;AppViewController.h&quot;<br />
@interface FormulaireViewController ()<br />
@end<br />
@implementation FormulaireViewController<br />
@synthesize adresse;<br />
@synthesize login;<br />
@synthesize password;<br />
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil<br />
{<br />
	self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];<br />
	if (self) {<br />
		// Custom initialization<br />
	}<br />
	return self;<br />
}<br />
- (void)viewDidLoad<br />
{<br />
	[super viewDidLoad];<br />
// Do any additional setup after loading the view.<br />
}<br />
- (void)viewDidUnload<br />
{<br />
	[self setAdresse:nil];<br />
	[self setLogin:nil];<br />
	[self setPassword:nil];<br />
	[super viewDidUnload];<br />
	// Release any retained subviews of the main view.<br />
}<br />
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation<br />
{<br />
	return (interfaceOrientation == UIInterfaceOrientationPortrait);<br />
}<br />
- (IBAction)seConnecter:(id)sender {<br />
  <br />
	NSString *textAdresse=adresse.text;<br />
	NSString *textLogin=login.text;<br />
	NSString *textPassword=password.text;<br />
	BOOL testConnectionForm;<br />
	Authentification *AuthForm=[[Authentification alloc] init];<br />
	testConnectionForm=[AuthForm login:textAdresse Lelogin:textLogin Lepassword:textPassword];<br />
	NSLog(@&quot;%@&quot;,[AuthForm token]);<br />
	if(testConnectionForm==YES){<br />
	  <br />
		Identification *IdentyForm=[[Identification alloc] init];<br />
		[IdentyForm setAdresse:textAdresse];<br />
		[IdentyForm setLogin:textLogin];<br />
		[IdentyForm setPassword:textPassword];<br />
		NSLog(@&quot;%@&quot;,[IdentyForm getAdresse]);<br />
	  <br />
		UILabel * titleApp = [[UILabel alloc] initWithFrame:CGRectMake(115, 5, 190, 30)];<br />
		titleApp.font = [UIFont fontWithName:@&quot;Arial-BoldMT&quot; size:18];<br />
		titleApp.textColor = [UIColor whiteColor];<br />
		titleApp.adjustsFontSizeToFitWidth = YES;<br />
		titleApp.text = @&quot;Utilitaire&quot;;<br />
		titleApp.backgroundColor = [UIColor clearColor];<br />
	  <br />
		[self.navigationController.navigationBar addSubview:titleApp];<br />
		[self.navigationController.navigationBar exchangeSubviewAtIndex:0 withSubviewAtIndex:1];<br />
	  <br />
		AppViewController *appliViewControllerForm = [self.navigationController.storyboard instantiateViewControllerWithIdentifier:@&quot;App&quot;];<br />
		[self.navigationController setNavigationBarHidden:NO animated:NO];<br />
		[self.navigationController pushViewController:appliViewControllerForm animated:YES];<br />
	  <br />
	}else {<br />
	  <br />
		UIAlertView *alertForm=[[UIAlertView alloc] initWithTitle:@&quot;Connection échoué&quot; message:@&quot;Votre tentative de connection a échoué. Vérifié que vous ayez bien saisie vos données ou que votre connection réseau fonctionne parfaitement&quot; delegate:nil cancelButtonTitle:@&quot;OK&quot; otherButtonTitles:nil];<br />
		[alertForm show];<br />
	  <br />
	}<br />
}<br />
-(IBAction)saisieReturn:(id)sender<br />
{<br />
	[sender resignFirstResponder];<br />
}<br />
@end




Donc là  je suis loguer, j'ai accéder à  la vue listant tout mes utilitaires, mon navigationbar affiche bien le titre que je veux et en plus j'ai un bouton "Back".

Quand je clique dessus, elle me permet de revenir à  la vue d'avant (Mon formulaire), sauf que là  au lieu d'afficher en titre de la bar de navigation "Formulaire", il m'affiche un mélange assez beurk de "Formulaire" et "Utilitaire". Pourquoi ?

Et aussi à  savoir est il possible d'avoir un autre bouton qui aura la fonction de quitter tout simplement directement mon application ?

Réponses

  • Petite correction



    En faite, je souhaiterais qu'au niveau de ma vue (ma liste d'utilitaire) ne plus avoir le bouton "back" et que au niveau de l'autre vue (mon Formulaire), sur la bar de navigation, avoir 2 boutons, un bouton qui me permettrais de quitter l'application et une autre, un bouton personnalisé, qui en faite remplacera mon bouton "Se connecter" qui se trouve en bas de ma vue.
  • BaardeBaarde Membre
    mai 2012 modifié #3
    Tu n'es pas sensé ajouté des vues manuellement dans la barre de navigation. Pour changer le titre affiché en fonction du contrôleur de vue visible à  l'écran. Il suffit de définir la propriété title du navigationItem de chaque contrôleur.



    Si tu souhaites modifier la façon dont le titre est affiché, deux possibilités :
    • si ton application ne fonctionne qu'avec iOS 5, tu peux utiliser la propriété titleTextAttributes de la barre de navigation
    • dans le cas contraire, du peux utiliser la propriété titleView du navigationItem du contrôleur de vue.
  • BaardeBaarde Membre
    Pour afficher un bouton dans la barre de navigation, de nouveau, il faut passer par le navigationItem du contrôleur de vue. Il possède deux propriétés nommées leftBarButtonItem et rightBarButtonItem.



    Je te conseille de lire la documentation fournie par Apple : Updating the Navigation Bar
  • Je te remercie, le problème que j'avais pour le titre est réglé en utilisant la propriété title du navigationItem de mon contrôleur.

    Du coup, je vois maintenant comment afficher un bouton dans la barre de navigation.

    Je voudrais juste du coup savoir, vu que je souhaite entre autre un bouton qui me permettrais de quitter l'application, existerait il une fonction prédifinis pour cela ?
  • Bon bien en lisant un autre post, visiblement on ne doit pas le faire, car il suffira de presser la touche home pour quitter l'application, mais j'ai l'impression que la touche home, ne fait que mettre mon application en pause. C'est à  dire que qu'on je clique sur l'icône il revient au même temps que je l'ai laissé en pressant sur la touche home.



    image/huh.gif' class='bbc_emoticon' alt='???' />
  • yoannyoann Membre
    'yass_1988' a écrit:


    Bon bien en lisant un autre post, visiblement on ne doit pas le faire, car il suffira de presser la touche home pour quitter l'application, mais j'ai l'impression que la touche home, ne fait que mettre mon application en pause. C'est à  dire que qu'on je clique sur l'icône il revient au même temps que je l'ai laissé en pressant sur la touche home.



    image/huh.gif' class='bbc_emoticon' alt='???' />




    C'est normal, ça s'appelle le multitache. Une application iOS n'est jamais quité sauf s'il y a un manque de ressource.
Connectez-vous ou Inscrivez-vous pour répondre.