2009-10-05 4 views
2

Le comportement par défaut lors de l'enfoncement d'un UIViewController sur un UINavigationController consiste pour le système d'exploitation à afficher un bouton de retour qui réactive le UIViewController.iPhone - Changement de cible ou de sélecteur pour le bouton Précédent sur UINavigationController

J'ai le désir de définir un comportement différent pour ce bouton retour (pour revenir en arrière deux écrans) - est là de toute façon je peux le faire sans avoir à créer mon propre bouton de retour avec graphique personnalisé, etc.

Merci à :)

Répondre

4

Comme je le soupçonnais à l'origine, ce n'est pas possible d'une manière exceptionnellement facile. Donc même méthode applique lors de la création de coutume UIBarButtonItem, viennent à la source l'icône du bouton de retour de Google ....

UIButton *backButtonInternal = [[UIButton alloc] initWithFrame:CGRectMake(0,0,54,30)]; 
[backButtonInternal setBackgroundImage:[UIImage imageNamed:@"backButton.png"] forState:UIControlStateNormal]; 
boldSystemFontOfSize:12]]; 
[backButtonInternal addTarget:self action:@selector(backButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
UIBarButtonItem *backBarButton = [[UIBarButtonItem alloc] initWithCustomView:backButtonInternal]; 
[backButtonInternal release]; 
[[self navigationItem] setLeftBarButtonItem:backBarButton]; 
[backBarButton release]; 
0

ya un problème avec la propriété navigationItem de UIViewController? Voici comment je reçois un bouton d'annulation, par exemple:

self.navigationItem.leftBarButtonItem = 
    [[[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemCancel 
               target: self 
               action: @selector(cancel)] autorelease]; 
2

Utilisation de la « leftBarButtonItem » vous permet de définir la cible et le sélecteur. Mais si vous définissez le "backBarButtonItem" sur le contrôleur précédent, la cible et le sélecteur seront ignorés. Cependant, leftBarButtonItem n'a pas la flèche pointant vers la gauche.

0

Dans viewcontroller des parents,

- (void)viewDidLoad 
{  
    self.navigationController.delegate= self; 
} 

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    if (viewController == self) 
    { 
     // your codes 
    } 
} 
0

Si vous sous-classe votre contrôleur de navigation, vous pouvez mettre en œuvre la popViewControllerAnimated: méthode et jeter un isKindOfClass: vérifier là pour déterminer si le contrôleur de vue que vous cherchez est être sauté. Par exemple:

- (UIViewController *)popViewControllerAnimated:(BOOL)animated 
{ 
    //Reference current controller being displayed 
    UIViewController *currentController = [self.viewControllers lastObject]; 

    //Check class 
    if ([currentController isKindOfClass:[MyDesiredController class]]) { 
     NSLog(@"Popping Desired Controller, Do Stuff Here"); 
    } 

    return [super popViewControllerAnimated:animated]; 
} 

Toutefois, cela ne supprime pas l'éclatement réelle du contrôleur de vue (nul retour arrêtera le contrôleur de sauter mais encore provoquer la barre de navigation pour faire apparaître ses informations et retourner NON à la shouldPop: délégué la méthode de la barre de navigation va quand même apparaître sur le contrôleur, j'ai entendu dire que cela ne se produit que lorsque vous utilisez un contrôleur de navigation, mais je n'ai pas testé cela). Pour votre situation, cependant, puisque vous souhaitez réactiver deux contrôleurs de vue, vous pouvez supprimer le second contrôleur de dernière vue de la propriété viewcontrollers du contrôleur de navigation en convertissant les contrôleurs de vue en nsmutablearray, en supprimant le contrôleur, puis en convertissant nsmutablearray revient à un tableau et le définit en tant que propriété viewcontrollers du contrôleur de navigation. Je n'ai pas testé cela mais j'ai pensé que je partagerais l'idée.

Questions connexes