Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

enter image description here

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

Swift 3.0, 3.2 или 4.0

Если ваш пользовательский ViewController, содержащий объект tableView, следует протоколам UITableViewController Delegate и Datasource, вы можете добавить системный 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"
    }
}

Ответ 8

Try:

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

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