2011-11-22 16 views
8

En mi aplicación hay muchos UIViewControllers con UINavigationControllers. Debe haber un botón "Atrás" y un "hogar" UIButton en el UINavigationBar. Todo esto funciona bien.Botón de retroceso personalizado en la barra de navegación

Pero algunos de mis UIViewControllers tienen nombres largos, y a veces hay un lugar demasiado pequeño para ellos. Estoy intentando sustituir la etiqueta original del botón "atrás" (que muestra el título de la vista anterior) con una costumbre "Volver", pero todo lo que intentó no funcionó:

// Title didn't change 
[self.navigationItem.backBarButtonItem setTitle:@"Back"]; 

// Action didn't set, no response from button (button didn't do anything) 
[self.navigationItem.leftBarButtonItem 
    setAction:self.navigationItem.backBarButtonItem.action]; 

Y necesito el botón "atrás" para tener un estilo como en esta pregunta: Draw custom Back button on iPhone Navigation Bar

+0

¿La respuesta proporcionada en la pregunta que usted hace referencia no es suficiente? –

+0

Establece (= cambia) el título de la vista anterior – SentineL

+0

posible duplicado de [Cómo cambiar el título del botón Atrás de UINavigationBar a "Atrás"] (http://stackoverflow.com/questions/8046622/how-to-change-the -title-of-the-uinavigationbar-back-button-to-back) – jrturton

Respuesta

6

probar este

UIBarButtonItem *backBarBtnItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(popViewController)]; 
[self.navigationItem setBackBarButtonItem:backBarBtnItem]; 

- (void)popViewController 
{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
+0

que no funcionó. Puedo quitar el botón de retroceso habitual y agregar el mío, pero ¿cómo hacer que tenga la forma habitual? – SentineL

+0

para eso necesitas agregar un botón personalizado que tenga esa imagen en forma supongo ... [[UIBarButtonItem alloc] initWithCustomView: customButton]; –

+0

ese es el código de un pequeño bárbaro, pero supongo que no hay otra solución ... Entonces, seamos bárbaros por un tiempo :) Gracias por responder de todos modos. – SentineL

50

Pruebe lo siguiente. Definitivamente va a trabajar:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UIImage *buttonImage = [UIImage imageNamed:@"back.png"]; 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [button setImage:buttonImage forState:UIControlStateNormal]; 
    button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height); 
    [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; 

    UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 
    self.navigationItem.leftBarButtonItem = customBarItem; 
    [customBarItem release]; 
} 

- (void)back { 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

Asegúrese de que tiene una imagen botón con el tamaño de un botón de la barra de navegación de vuelta en su carpeta de recursos con nombre back.png.

Siéntase libre si se requiere otra asistencia.

+0

Me parece que puede hacer que el botón de retroceso personalizado no se distinga del botón anterior de stock iOS al establecer también una imagen para el estado resaltado, así: [button setImage: highlightedButtonImage forState: UIControlStateHighlighted]; –

+0

¿por qué no puedo agregar un título a mi botón de retroceso personalizado con este código? '[button setTitle: @" Back "forState: UIControlStateNormal];' – ArVan

+0

La barra de navegación tiene el botón de tipo UIBarButton.Puede crear elementos UIBarButton con contenido personalizado o crear elementos de sistema estándar según sus necesidades. –

2

Si usted está haciendo esto todo el lugar como yo, es mejor implementar la solución de Anil como una categoría:

@interface UIViewController (CustomBackButton) 

- (void) setCustomBackButton; 
- (void) back; 

@end 

@implementation UIViewController (CustomBackButton) 

- (void) setCustomBackButton 
{ 
    UIImage *buttonImage = [UIImage imageNamed:@"back.png"]; 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [button setImage:buttonImage forState:UIControlStateNormal]; 
    button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height); 
    [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; 
    UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 
    self.navigationItem.leftBarButtonItem = customBarItem; 
} 

- (void) back 
{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

@end 
1

Más sencillamente:

UIBarButtonItem *barBtnItem = 
    [[UIBarButtonItem alloc]initWithTitle:@"Indietro" 
            style:UIBarButtonItemStyleBordered 
           target:self 
           action:@selector(pop)]; 
[barBtnItem setTintColor:[UIColor whiteColor]]; 
self.navigationItem.leftBarButtonItem = barBtnItem; 
7

Target : personalizando todos los botones Atrás en UINavigationBar a un icono blanco

Pasos: 1. en "didFinishLaunchingWithOptions" método de AppDelete:

UIImage * backBtnIcon = [UIImage imageNamed: @ "navBackBtn"];

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { 
    [UINavigationBar appearance].tintColor = [UIColor whiteColor]; 
    [UINavigationBar appearance].backIndicatorImage = backBtnIcon; 
    [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon; 
}else{ 

    UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)]; 
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault]; 
} 

2.in el método "viewDidLoad" de la clase ViewController muy común:

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { 
     UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"" 
                    style:UIBarButtonItemStylePlain 
                    target:nil 
                    action:nil]; 
     [self.navigationItem setBackBarButtonItem:backItem]; 
    }else{ 
     //do nothing 
    } 
0

Suponga que tiene dos controladores - Controller1 y Controller2. Controller2 es empujado desde Controller1. Así que antes de empujar el Controller2 en el navigationController de Controller1

Controller2 *controller2 = [[[Controller2 alloc] init]autorelease]; 
self.navigationItem.hidesBackButton = YES; 

Ahora, en el viewDidLoad: Forma de Controller2, añadir el siguiente fragmento de

UIBarButtonItem *backBarButtonItem =[[[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(goBackToAllPets:)]autorelease]; 
self.navigationItem.leftBarButtonItem = backBarButtonItem; 

y en el método backButtonClicked, se pueden realizar las comprobaciones que querer.

Cuestiones relacionadas