web-dev-qa-db-fra.com

Le titre changeant d'UIBarButtonItem ne fonctionne pas

Comment changer le titre d'un UIBarButtonItem? J'ai le code suivant qui est appelé quand un bouton "edit" est pressé sur mon UINavigationBar.

-(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;
    }
}

Le bouton "modifier" change de couleur (la ligne qui définit le style fonctionne), mais la ligne qui définit le titre du bouton ne fonctionne pas.

23
CodeGuy

J'ai fait ce qui suit pour changer dynamiquement le titre d'un UIBarButtonItem. Dans cette situation, je n'utilise pas de UIViewTableController et je ne peux pas utiliser le editButton standard. J'ai une vue avec une table, ainsi que d'autres sous-vues et je voulais émuler le comportement de la limite UIViewTableController.

- (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];
    }
}

Notez que je n'ai pas utilisé le bouton BarButton UIBarButtonSystemItemEdit , vous ne pouvez pas modifier manuellement le nom de ce bouton, ce qui est logique.

Vous pouvez également tirer parti de la propriété possibleTitles afin que le bouton ne soit pas redimensionné lorsque vous modifiez le titre.

Si vous utilisez un Storyboard/XIB pour créer/définir ces boutons, assurez-vous que l'identificateur d'élément de bouton de barre est défini sur Personnalisé pour le bouton pour lequel vous souhaitez contrôler le titre.

33
Seamus

J'ai eu ce problème et je l'ai résolu en définissant le style UIBarButtonItem sur le type personnalisé lors de son initialisation. Ensuite, les titres seraient définis lors de la modification de leurs valeurs de titre.

Vous pouvez également définir la valeur possibleTitle dans la méthode viewDidLoad pour vous assurer que le bouton est correctement dimensionné pour tous les titres possibles qu'il peut avoir.

24
Mark Bridges

Dans mon cas, ce qui empêchait l'affichage du titre, c'était que, dans xib, j'avais sélectionné la propriété "Identificateur" de l'élément du bouton Bar comme "Annuler". 

enter image description here

J'ai essayé de définir la propriété title avant même d'affecter le bouton à la barre de navigation, mais le titre n'était pas mis à jour. 

Je l'ai fait comme ça:

enter image description here Et cela a commencé à fonctionner comme je le voulais.

7
Joe M

Si vous consultez la documentation de la propriété title , il est explicitement mentionné que vous devez la définir avant de l'affecter à la barre de navigation. Au lieu de faire ce que vous faites maintenant, vous pouvez utiliser deux éléments de bouton de barre - un pour terminé et un pour éditer, et les définir alternativement.

7

En fait, si tout ce que vous voulez si vous passez de "Edit" à "Done", utilisez simplement self.navigationItem.rightBarButtonItem = self.editButtonItem;

Il va gérer cette transition pour vous

2
gyan

Il suffit de changer les boutons chaque fois que l'utilisateur les appuie.

- (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];
}

Et puis créez un IBAction pour gérer la pression du bouton:

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

Swift 3.0, 3.2 ou 4.0

Si votre ViewController personnalisé contenant un objet tableView suit les protocoles UITableViewController Delegate et Datasource, vous pouvez ajouter un système editBarButtonItem à votre navigationItem.leftBarButtonItem (s) ou à votre navigationItem.rightBarButtonItem (s) avec le code suivant:

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"
    }
}
0
umarqattan