right custom bar ios uinavigationbar uibarbuttonitem

ios - custom - UIBarButtonItem cambio de título no funciona



uibarbuttonitem image swift (8)

¿Cómo puedo cambiar el título de un UIBarButtonItem? Tengo el siguiente código que se llama cuando se presiona un botón "editar" en mi barra UINavigation

-(void)editButtonSelected:(id)sender { NSLog(@"edit button selected!"); if(editing) { NSLog(@"notediting"); [super setEditing:NO animated:NO]; [tableView setEditing:NO animated:NO]; [tableView reloadData]; [rightButtonItem setTitle:@"Edit"]; [rightButtonItem setStyle:UIBarButtonItemStylePlain]; editing = false; } else { NSLog(@"editing"); [super setEditing:YES animated:YES]; [tableView setEditing:YES animated:YES]; [tableView reloadData]; [rightButtonItem setTitle:@"Done"]; [rightButtonItem setStyle:UIBarButtonItemStyleDone]; editing = true; } }

El botón "editar" está cambiando de color (por lo que la línea que establece el estilo funciona), sin embargo, la línea que establece el título del botón no funciona.


Swift 3.0, 3.2 o 4.0

Si su ViewController personalizado que contiene un objeto tableView sigue los protocolos UITableViewController Delegate y Datasource, puede agregar un sistema editBarButtonItem a su navigationItem.leftBarButtonItem (s) o navigationItem.rightBarButtonItem (s) con el siguiente código:

func setupTableView() { tableView.delegate = self tableView.dataSource = self navigationItem.rightBarButtonItem = editButtonItem editButtonItem.action = #selector(CustomViewController.editTableView(_:)) } @objc func editTableView(_ sender: UIBarButtonItem) { tableView.isEditing = !tableView.isEditing if tableView.isEditing { sender.title = "Done" } else { sender.title = "Edit" } }


En mi caso, lo que impidió que se mostrara el título fue que en la xib seleccioné la propiedad ''identificador'' del elemento de la Barra como ''Cancelar''.

Intenté establecer la propiedad del título incluso antes de asignar el botón a la barra de navegación, pero el título no se estaba actualizando.

Lo hice así:

Y empezó a funcionar como yo quería.


En realidad, si todo lo que quiere es cambiar entre "Editar" y "Hecho", use solo self.navigationItem.rightBarButtonItem = self.editButtonItem;

Se encargará de esta transición por ti.


He hecho lo siguiente para cambiar dinámicamente el título de un UIBarButtonItem. En esta situación, no estoy usando un UIViewTableController y no puedo usar el editButton estándar. Tengo una vista con un tableView, así como otras subvistas, y quería emular el comportamiento del UIViewTableController limitado.

- (void)InitializeNavigationItem { NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:2]; UIBarButtonItem* barButton; barButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addNewItem:)]; barButton.style = UIBarButtonItemStyleBordered; [array addObject:barButton]; // -------------------------------------------------------------------------------------- barButton = [[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStyleBordered target:self action:@selector(editMode:)]; barButton.style = UIBarButtonItemStyleBordered; barButton.possibleTitles = [NSSet setWithObjects:@"Edit", @"Done", nil]; [array addObject:barButton]; self.navigationItem.rightBarButtonItems = array; } - (IBAction)editMode:(UIBarButtonItem *)sender { if (self.orderTable.editing) { sender.title = @"Edit"; [self.orderTable setEditing:NO animated:YES]; } else { sender.title = @"Done"; [self.orderTable setEditing:YES animated:YES]; } }

Tenga en cuenta que no usé el botón de barra UIBarButtonSystemItemEdit , no puede cambiar manualmente el nombre de ese botón, lo cual tiene sentido.

También es posible que desee aprovechar la propiedad possibleTitles para que el botón no cambie de tamaño cuando cambie el título.

Si está utilizando un Guión gráfico / XIB para crear / configurar estos botones, asegúrese de que el Identificador del elemento del botón de barra esté configurado en Personalizado para el botón para el que desea controlar el título.


Si observa la documentación de la propiedad del title , se menciona explícitamente que debe establecerla antes de asignarla a la barra de navegación. En lugar de hacer lo que está haciendo en este momento, puede usar dos elementos de botón de barra, uno para terminar y otro para editar, y configurarlos como alternativa.


Simplemente apague los botones cada vez que el usuario los presione.

- (void)setNavigationButtonAsEdit { UIBarButtonItem* editButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Edit", @"") style:UIBarButtonItemStylePlain target:self action:@selector(editButtonPressed:)]; self.navigationItem.rightBarButtonItems = [NSArray arrayWithObject:editButton]; } - (void)setNavigationButtonAsDone { UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Done", @"") style:UIBarButtonItemStylePlain target:self action:@selector(editButtonPressed:)]; self.navigationItem.rightBarButtonItems = [NSArray arrayWithObject:doneButton]; }

Y luego crea una acción de IB para manejar el botón presionando:

- (IBAction)editButtonPressed:(id)sender { NSString* buttonText = [sender title]; if ([buttonText isEqualToString:NSLocalizedString(@"Edit",@"")]) { [self setNavigationButtonAsDone]; } else { [self setNavigationButtonAsEdit]; } }


Tratar:

UIButton *rightButton; rightButton = (UIButton*)self.navigationItem.rightBarButtonItem.customView; [rightButton setTitle:@"Done" forState:UIControlStateNormal];

Porque rightBarButtonItem.customView == “the button your added” .


Tuve este problema y lo resolví configurando el estilo UIBarButtonItem al tipo personalizado cuando se inicializa. Entonces los títulos se establecerían al cambiar sus valores de título.

También es posible que desee establecer el valor del título posible en el método viewDidLoad para garantizar que el botón tenga el tamaño correcto para todos los títulos posibles que pueda tener.