UIBarButtonItem изменение названия не работает - PullRequest
24 голосов
/ 28 мая 2011

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

Кнопка «edit» меняет цвет (поэтому работает строка, задающая стиль), однакострока, которая устанавливает заголовок кнопки, не работает.

Ответы [ 8 ]

34 голосов
/ 13 февраля 2012

Я сделал следующее, чтобы динамически изменить заголовок 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];
    }
}

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

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

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

24 голосов
/ 05 февраля 2013

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

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

8 голосов
/ 17 февраля 2015

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

enter image description here

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

Я сделал это так:

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

8 голосов
/ 28 мая 2011

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

2 голосов
/ 20 января 2015

На самом деле, если все, что вы хотите, если переключаться между «Редактировать» и «Готово», просто используйте self.navigationItem.rightBarButtonItem = self.editButtonItem;

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

1 голос
/ 24 сентября 2013

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

- (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];
    }
}
0 голосов
/ 10 августа 2017

Swift 3.0, 3.2 или 4.0

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

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 голосов
/ 25 марта 2014

Попробуйте:

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

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

...