2010-07-08 24 views
5

Quiero desactivada por defecto del botón atrás del mando de navegación¿Podemos deshabilitar el controlador de navegación de leftBarButtonItem que es el botón de retroceso del controlador de vista en iPhone?

self.navigationItem.rightBarButtonItem.enabled = NO; 
// Below code does not work since leftBarButtonItem is always nil. 
self.navigationItem.leftBarButtonItem.enabled = NO; 

lo he hecho con la muestra manualmente más adelante, pero ¿hay alguna propiedad para personas con discapacidad el botón predeterminado de vuelta con sólo una línea?

backButton = [[UIButton alloc] initWithFrame:CGRectMake(5, 5, 100, 30)]; 
[backButton setBackgroundImage:[UIImage imageNamed:@"backbutton_100.png"] forState:UIControlStateNormal]; 
[backButton addTarget:self action:@selector(backAction:) forControlEvents:UIControlEventTouchUpInside]; 
[backButton setTitle:@" All Customers" forState:UIControlStateNormal]; 
backButton.titleLabel.font = [UIFont boldSystemFontOfSize:12]; 
[buttonView addSubview:backButton]; 

UIBarButtonItem* leftButton = [[UIBarButtonItem alloc] initWithCustomView:buttonView]; 
self.navigationItem.leftBarButtonItem = leftButton; 
[leftButton release]; 

// Now it is working. 
self.navigationItem.leftBarButtonItem.enabled = NO; 
+0

El botón Atrás es el izquierdo, ¿por qué intentas configurar rightBarButtonItem.enabled en NO? ¿No debería ser dejado? Además, actualice su pregunta y trate de que su código se muestre correctamente. Use 4 espacios ("") en cada línea para alinearla a la derecha. Estamos aquí para ayudar, no para descifrar ;-) – Kalle

Respuesta

5

El uso de "hidesBackButton = YES" no es realmente una solución elegante, ya que oculta el botón que no es lo que queremos. Una solución aceptable sería agregar un UILabel a la ventana justo sobre el botón Atrás, al menos desactivando los toques en el botón.

Añadir este método a la clase AppDelegate:

- (void) disableLeftBarButtonItemOnNavbar:(BOOL)disable 
{ 
    static UILabel *l = nil; 

    if (disable) { 
     if (l != nil) 
      return; 
     l = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, 160, 44)]; 
     l.backgroundColor = [UIColor clearColor]; 
     l.userInteractionEnabled = YES; 
     [self.window addSubview:l]; 
    } 
    else { 
     if (l == nil) 
      return; 
     [l removeFromSuperview]; 
     [l release]; 
     l = nil; 
    } 
} 

Se le puede llamar así desde cualquier controlador de vista para desactivar:

MyAppDelegate *appDeleg = (MyAppDelegate *) [[UIApplication sharedApplication] delegate]; 
[appDeleg disableLeftBarButtonItemOnNavbar:YES]; 

Para habilitar:

MyAppDelegate *appDeleg = (MyAppDelegate *) [[UIApplication sharedApplication] delegate]; 
[appDeleg disableLeftBarButtonItemOnNavbar:NO]; 
+1

Gracias por su respuesta –

+0

De nada. –

+0

Hay un error con el código y un dispositivo rotativo, tendrías que hacer una transformación afín para que funcione correctamente en otras orientaciones. – Heckman

2

llamada [self.navigationItem setHidesBackButton:YES]; para el controlador de vista que no quieren tener el botón de retroceso. Luego configure el leftBarButtonItem de forma normal.

+0

Me alegro de poder ayudar. – jrtc27

+1

Quiero deshabilitar el botón que no oculta el botón, gracias por su respuesta –

+0

¿Por qué no crear una instancia de UIBarButtonItem, establecerlo en leftBarButtonItem, ocultar BackButton y establecer leftBarButtonItem en su botón. Luego desactive el leftBarButtonItem. – jrtc27

11

Su muy fácil ..... solo pruebe

self.navigationController.navigationBar.userInteractionEnabled = NO; //for disabling 

self.navigationController.navigationBar.userInteractionEnabled = YES; //for again enabling 
+2

No aparece deshabilitado (con texto gris oscuro), pero funciona y es mejor que ocultar el botón. +1 –

+0

Me funciona, gracias – derpoliuk

1

También puede utilizar

[[_navigationController.topViewController.navigationItem leftBarButtonItem] setEnabled:NO]; // The top view controller on the stack. 
[[_navigationController.visibleViewController.navigationItem leftBarButtonItem] setEnabled:NO];// Return modal view controller if it exists. Otherwise the top view controller. 

puede utilizar esta opción cuando desee desactivar o activar UIViewControler de AppDelegate, o cualquier otra viewcontroler.

Cuestiones relacionadas