ios - son - Cómo escondo/muestro el botón derecho en la barra de navegación
donde esta el menu de safari en ipad (13)
Necesito ocultar el botón derecho en la barra de navegación, luego mostrarlo después de que el usuario seleccione algunas opciones.
Lamentablemente, lo siguiente no funciona:
NO GOOD: self.navigationItem.rightBarButtonItem.hidden = YES; // FOO CODE
¿Hay alguna manera?
- Supongamos que puede hacer referencia al botón de barra específico como variable
xxxButton
(abra el Editor Asistente, el botón Control + Arrastrar xxx a la clase YourViewController como salida "xxxButton").
o puede usar algo como let xxxButton = navigationBar.buttons[1]
Ocultar
xxxButton.customView = UIView()
onavigationItem.rightBarButtonItems?.remove(at: (navigationItem.rightBarButtonItems?.index(of:xxxButton)!)!)
Mostrar
xxxButton.customView = nil
onavigationItem.rightBarButtonItems?.insert(newElement: xxxButton, at:SOME_INDEX)
Espero que sea útil.
Aquí está la solución de Matt actualizada para Storyboards y ARC. Recuerde, IBOutlets son __weak por defecto, por lo que debe cambiarlo a strong para que no se libere 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
El crédito tiene que ir al learner para esta respuesta que la respuesta es de esta pregunta:
ocultar y mostrar el botón de la barra de navegación a la izquierda 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];
}
Luego, solo hace referencia al método donde lo necesita dentro de un (IBAction)
como (IBAction)
:
[self hideAndDisableLeftNavigationItem];//[self showAndEnableLeftNavigationItem]; to show again
@property (...) UIBarButtonItem....
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.
Esconder:
if let topItem = self.navigationController?.navigationBar.topItem {
topItem.rightBarButtonItem = nil
}
Espectáculo:
//set navigationItem tint color white
self.navigationItem.rightBarButtonItem.tintColor = [UIColor whiteColor];
Esconder:
//set navigationItem tint clear white
self.navigationItem.rightBarButtonItem.tintColor = [UIColor clearColor];
Espectáculo:
[self.navigationItem.rightBarButtonItem.customView setAlpha:0.0];
Esconder:
[UIView animateWithDuration:0.2 animations:^{
[self.navigationItem.rightBarButtonItem.customView setAlpha:1.0];
}];
Incluso puedes animar su mostrar / esconder
if let button = self.navigationItem.rightBarButtonItem {
button.isEnabled = false
button.tintColor = UIColor.clear
}`
Espectáculo:
[self.navigationItem.rightBarButtonItem.customView setHidden:NO];
Esconder:
[self.navigationItem.rightBarButtonItem.customView setHidden:YES];
Establecer referencia a nil:
current_controller_in_navcontroller.navigationItem.rightBarButtonItem = nil;
También asegúrese de llamar esto al controlador que se muestra actualmente en navController, no para el navegador navController.
Mi solución:
self.navigationItem.rightBarButtonItem.customView.hidden=NO;
Oculte el botón configurando la referencia en cero, sin embargo, si desea restaurarla más tarde, deberá esperar una copia para poder reasignarla.
UIBarButtonItem *oldButton = self.navigationItem.rightBarButtonItem;
[oldButton retain];
self.navigationItem.rightBarButtonItem = nil;
//... later
self.navigationItem.rightBarButtonItem = oldButton;
[oldButton release];
Personalmente, en mis aplicaciones, configuro mis botones de navegación en @properties, de modo que puedo destruirlos y recrearlos a voluntad, por lo que me gustaría 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;
Para Swift 3
[self.navigationItem.rightBarButtonItem.customView setAlpha:1.0];
SWIFT 2.2
En swift 2.2 self.navigationItem no funciona. En su lugar, cree una salida del elemento NavigationItem (lo llamé debajo de "nav") y úselo.
Además, la siguiente sugerencia no funcionó para mí usando Xcode 7.3 y swift 2.2
nav.leftBarButtonItem?.customView?.hidden = true
Entonces usé la idea de @Matt J arriba de la siguiente manera (tengo 2 elementos a la izquierda):
Crear puntos de venta para los artículos en 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()
Guarde los elementos en viewDidLoad ()
sav_settingItem = nav.leftBarButtonItems![0] sav_logoItem = nav.leftBarButtonItems![1]
Para OCULTAR, configúrelos como nulos
nav.leftBarButtonItem = nil nav.leftBarButtonItem = nil
PARA MOSTRARLOS
if (nav.leftBarButtonItem == nil) { nav.leftBarButtonItem = sav_settingItem nav.leftBarButtonItems?.append(sav_logoItem) return }
Swift 2 :
¡Truco!
Esconder:
if let btn = self.tabBarController!.navigationItem.rightBarButtonItem {
btn.enabled = false
btn.title = ""
}
Espectáculo:
if let btn = self.tabBarController!.navigationItem.rightBarButtonItem {
btn.enabled = true
btn.title = "ButtonName"
}