Cómo ocultar / mostrar el botón derecho en la Barra de navegación


Necesito ocultar el botón derecho en la Barra de navegación, luego mostrarlo después de que el usuario seleccione algunas opciones.

Desafortunadamente, lo siguiente no funciona:

NO GOOD: self.navigationItem.rightBarButtonItem.hidden = YES;  // FOO CODE

Hay una manera?

Author: Vadim Kotov, 2011-04-08

13 answers

Oculte el botón estableciendo la referencia a nil, sin embargo, si desea restaurarlo más tarde, necesitará guardar una copia para poder reasignarlo.

UIBarButtonItem *oldButton = self.navigationItem.rightBarButtonItem;
[oldButton retain];
self.navigationItem.rightBarButtonItem = nil;

//... later
self.navigationItem.rightBarButtonItem = oldButton;
[oldButton release];

Personalmente, en mis aplicaciones hago que mis botones de navegación sean @properties, para que pueda eliminarlos y recrearlos a voluntad, así que algo como:

//mycontroller.h
UIBarButtonItem *rightNavButton;
@property (nonatomic, retain) UIBarButtonItem *rightNavButton;

//mycontroller.m
@synthesize rightNavButton;
- (UIBarButtonItem *)rightNavButton {
    if (!rightNavButton) {
        rightNavButton = [[UIBarButtonItem alloc] init];
        //configure the button here
    }
    return rightNavButton;
}

//later, in your code to show/hide the button:
self.navigationItem.rightBarButtonItem = self.rightNavButton;
 70
Author: Matt J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-07 23:57:03

Establecer referencia a nil:

current_controller_in_navcontroller.navigationItem.rightBarButtonItem =  nil;

También asegúrese de llamar a esto en el controlador mostrado actualmente por el NavController, no para el propio NavController.

 9
Author: Stefan Ticu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-07 23:44:04

Para Swift 3

if let button = self.navigationItem.rightBarButtonItem {
                    button.isEnabled = false
                    button.tintColor = UIColor.clear
                }`
 9
Author: richc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-23 12:03:55

Mostrar:

[self.navigationItem.rightBarButtonItem.customView setAlpha:1.0];

Ocultar:

[self.navigationItem.rightBarButtonItem.customView setAlpha:0.0];

Incluso puede animar su mostrar/ocultar

[UIView animateWithDuration:0.2 animations:^{
        [self.navigationItem.rightBarButtonItem.customView setAlpha:1.0];

    }];
 7
Author: HugoMasterPL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-15 07:40:13

Aquí está la solución de Matt actualizada para Storyboards y ARC. Recuerde, los IBOutlets son _ _ débiles por defecto, por lo que necesita cambiarlo a fuerte para que no se publique demasiado pronto.

@interface MAGTableViewController () <UITextFieldDelegate>

@property (strong, nonatomic) IBOutlet UIBarButtonItem *rightBarButton;

@end

@implementation MAGTableViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.navigationItem setRightBarButtonItem:nil];
}

- (IBAction)rightBarButtonItemTapped:(id)sender
{
    [self.view endEditing:YES];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self.navigationItem setRightBarButtonItem:self.rightBarButton];
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self.navigationItem setRightBarButtonItem:nil];
}

@end
 5
Author: mmackh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-21 08:52:41

SWIFT 2.2

En swift 2.2 self.navigationItem no funciona. En su lugar, cree una salida del navigationItem (lo nombré debajo de "nav") y utilícelo.

También la siguiente sugerencia no funcionó para mí usando Xcode 7.3 y swift 2.2

 nav.leftBarButtonItem?.customView?.hidden = true

Así que usé la idea de @ Matt J de la siguiente manera (tengo 2 elementos a la izquierda):

  1. Crear salidas para los elementos de la barra de navegación y variables para almacenarlos

    @IBOutlet weak var settingItem: UIBarButtonItem!
    @IBOutlet weak var logoItem: UIBarButtonItem!
    
    var sav_settingItem: UIBarButtonItem = UIBarButtonItem()
    var sav_logoItem: UIBarButtonItem = UIBarButtonItem()
    
  2. Guarde los elementos en viewDidLoad ()

    sav_settingItem = nav.leftBarButtonItems![0]
    sav_logoItem = nav.leftBarButtonItems![1]
    
  3. Para OCULTAR ponlos en nil

    nav.leftBarButtonItem = nil
    nav.leftBarButtonItem = nil
    
  4. Para MOSTRARLES

    if (nav.leftBarButtonItem == nil) {
        nav.leftBarButtonItem = sav_settingItem
        nav.leftBarButtonItems?.append(sav_logoItem)
        return
    }
    
 4
Author: Zvi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-02 14:28:18

El crédito tiene que ir a aprendiz para esta respuesta que la respuesta es de esta pregunta:

Ocultar y mostrar el botón izquierdo de la barra de navegación bajo demanda en iOS-7

Esta es la respuesta, que es mucho más simple.

//hide and reveal bar buttons
-(void) hideAndDisableLeftNavigationItem
{
    [self.navigationItem.leftBarButtonItem setTintColor:[UIColor clearColor]];
    [self.navigationItem.leftBarButtonItem setEnabled:NO];
}

-(void) showAndEnableLeftNavigationItem
{
    [self.navigationItem.leftBarButtonItem setTintColor:[UIColor blueColor]];
    [self.navigationItem.leftBarButtonItem setEnabled:YES];
}

Entonces solo hace referencia al método donde lo requiere como dentro de un (IBAction) como así:

[self hideAndDisableLeftNavigationItem];//[self showAndEnableLeftNavigationItem]; to show again

Probé todos los otros métodos y ninguno funcionó, incluso haciendo referencia a mi botón como @property (...) UIBarButtonItem.... y nada funcionó hasta que encontré esto.

 3
Author: App Dev Guy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:37

Mostrar:

[self.navigationItem.rightBarButtonItem.customView setHidden:NO];

Ocultar:

[self.navigationItem.rightBarButtonItem.customView setHidden:YES];
 2
Author: Amr Angry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-05 19:21:15

Swift 2:

Trick!

Ocultar:

if let btn = self.tabBarController!.navigationItem.rightBarButtonItem {
        btn.enabled = false
        btn.title = ""
}

Mostrar:

if let btn = self.tabBarController!.navigationItem.rightBarButtonItem {
        btn.enabled = true
        btn.title = "ButtonName"
}
 2
Author: Vahid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-15 11:18:55

Mi solución:

self.navigationItem.rightBarButtonItem.customView.hidden=NO;
 1
Author: kozla13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-28 12:08:10

Mostrar:

//set navigationItem tint color white
self.navigationItem.rightBarButtonItem.tintColor = [UIColor whiteColor];

Ocultar:

//set navigationItem tint clear white
self.navigationItem.rightBarButtonItem.tintColor = [UIColor clearColor];
 0
Author: jebin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-19 07:34:33
  1. Supongamos que puede hacer referencia al botón de barra específico como variable xxxButton

(por favor, abra el Editor Asistente, Control+Arrastre el botón xxx a su clase ViewController como salida "xxxButton").

O puedes usar algo como let xxxButton = navigationBar.buttons[1]

  1. Ocultar xxxButton.customView = UIView() o navigationItem.rightBarButtonItems?.remove(at: (navigationItem.rightBarButtonItems?.index(of:xxxButton)!)!)

  2. Mostrar xxxButton.customView = nil o navigationItem.rightBarButtonItems?.insert(newElement: xxxButton, at:SOME_INDEX)

Esperanza útil.

 0
Author: osexp2003,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-01 14:48:18

Para ocultar:

if let topItem = self.navigationController?.navigationBar.topItem {
    topItem.rightBarButtonItem = nil
}
 0
Author: Stalker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-15 15:28:48