UIBarButtonItem изменение названия не работает

Как я могу изменить название UIBarButtonItem? У меня есть следующий код, который вызывается при нажатии кнопки "Редактировать" на моем 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;
    }
}

кнопка "Редактировать" меняет цвет (поэтому линия, которая задает стиль, работает), однако линия, которая задает заголовок кнопки, не работает.

8 ответов


Я сделал следующее, чтобы динамически изменить название UIBarButtonItem. В этой ситуации я не использую UIViewTableController и не могу использовать стандартный editButton. У меня есть представление с tableView, а также другими подвидами, и я хотел бы эмулировать поведение ограниченного 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];
    }
}

обратите внимание, что я не использовал uibarbuttonsystemitemedit barButton, вы не можете вручную изменить имя этой кнопки, которая делает чувство.

вы также можете воспользоваться свойством possibleTitles, чтобы кнопка не изменяла размер при изменении заголовка.

Если вы используете раскадровку / XIB для создания / установки этих кнопок, убедитесь,что идентификатор элемента кнопки Bar установлен в Custom для кнопки, для которой вы хотите управлять заголовком.


У меня была эта проблема и я решил ее, установив стиль UIBarButtonItem в пользовательский тип при его инициализации. Затем заголовки будут установлены при изменении их значений заголовка.

вы также можете установить значение possibleTitle в методе viewDidLoad, чтобы обеспечить правильный размер кнопки для всех возможных заголовков, которые она может иметь.


Если вы посмотрите на документация title свойство, явно указано, что вы должны установить его перед назначением на панель навигации. Вместо того, чтобы делать то, что вы делаете прямо сейчас, вы можете использовать два элемента кнопки панели – один для готово и один для редактирования, и установить их поочередно.


в моем случае то, что помешало отображению заголовка, заключалось в том, что в xib я выбрал свойство элемента кнопки "идентификатор" как "отмена".

enter image description here

Я попытался установить свойство title еще до назначения кнопки на панель навигации, но заголовок не обновлялся.

Я сделал так:

enter image description here И он начал работать так, как я хотел.


просто переключайте кнопки каждый раз, когда пользователь нажимает их.

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

а затем создайте IBAction для обработки нажатия кнопки:

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

на самом деле, если все, что вы хотите, если переключение между "редактировать " и" готово", просто используйте self.navigationItem.rightBarButtonItem = self.editButtonItem;

Он будет обрабатывать этот переход для вас


Swift 3.0, 3.2 или 4.0

если ваш пользовательский ViewController, содержащий объект tableView, следует делегату UITableViewController и протоколам источника данных, вы можете добавить системный editBarButtonItem к вашему navigationItem.leftBarButtonItem(s) или navigationItem.rightBarButtonItem(s) со следующим кодом:

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

попробуй:

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

, потому что rightBarButtonItem.customView == “the button your added”.