Изменение названия UIBackButtonItem
У меня есть приложение, ориентированное на navigationController. Я хочу изменить заголовок кнопки "Назад" для контроллера корневого представления. Я пробовал следующий код в методе viewViewDoadLoad rootViewController, но не успел:
self.navigationItem.backBarButtonItem.title = @"Back";
Любые идеи?
Ответы
Ответ 1
Название кнопки "Назад" :
- Заголовок предыдущего контроллера представления
- Имя предыдущей кнопки навигации навигационного элемента предыдущего элемента управления
Если вы устанавливаете кнопку "Назад" для элемента навигации текущего контроллера, вы не устанавливаете кнопку, отображаемую в текущем виде. Фактически вы устанавливаете кнопку "Назад" , которая будет использоваться, если вы нажмете на нее еще один контроллер вида.
Ответ 2
У меня был успех, создав свой собственный UIBarButtonItem вместо установки названия существующего:
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;
[backButton release];
Ответ 3
Возможно, уже ответил, но не просто.
self.navigationItem.backBarButtonItem
по умолчанию - nil. Поэтому, если вы установите для него заголовок, ничего не произойдет, потому что это влияет на объект адреса nil
. Это не приведет к ошибке, поскольку objective-c позволяет отправлять сообщения nil
.
ОТВЕТ: Вы должны создать свой собственный объект кнопки, чтобы установить его название. Вы можете initWithTitle
или создать его, а затем установить заголовок позже.
PS - как уже упоминалось, backBarButtonItem
влияет только на дочерние представления, которые накладываются поверх него в стеке навигации. В зависимости от того, как вы создали свое приложение, корневой вид больше не может быть вытолкнут и не может иметь кнопку "Назад". Хотя, вы можете повлиять на leftBarButtonItem
.
Ответ 4
Кнопка "Назад" выводит текст из заголовка родительского контроллера представления.
В контроллере родительского представления (контроллер отображения, который появляется при нажатии кнопки "Назад" ), установите его собственный заголовок как нужный текст на задней панели.
Например, допустим, что мы имеем класс RootViewController
. Когда мы щелкаем ячейку в ее табличном представлении, мы нажимаем экземпляр SecondViewController
. Мы хотим, чтобы кнопка "назад" экземпляра SecondViewController
читала "Главная".
в методе viewDidLoad
для RootViewController.m:
self.title = @"Home";
в методе viewDidLoad
SecondViewController.m:
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;
[backButton release];
Если вы хотите, чтобы ваша кнопка "Назад", "Назад", установите заголовок родительского контроллера представления на @"Back"
;
Ответ 5
Вы не можете просто изменить заголовок кнопки "Назад" в контроллере корневого представления, потому что контроллер корневого представления не отображает кнопку "Назад". В конце концов, это корень, к чему вы можете вернуться? Хотя в вашем приложении может быть что-то логичное, нет ничего очевидного в реализации по умолчанию.
Вместо этого вы можете разместить пользовательскую кнопку вместо того, чтобы вам действительно нужен элемент управления (создайте UIBarButtonItem и установите для него navigationItem.backBarButtonItem), хотя это не будет иметь тот же внешний вид, что и один из стандартных (он будет квадрат, в отличие от стрелки).
Ответ 6
Ответы Михая Дамиана и Криса Лунди верны.
Еще одна вещь, которую следует отметить, это то, что если вы измените свой viewController navigationItem.title после установки своего настраиваемого параметра navigationItem.backBarButtonItem, он вернется к своему состоянию по умолчанию, которое должно отменить ваш пользовательский backBarButtonItem и вместо этого использовать новый заголовок, который вы просто установите.
Итак, я гарантирую, что я повторно устанавливаю backBarButtonItem всякий раз, когда я изменяю заголовок viewController:
self.navigationItem.title = @"New Title";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];
backButton.title = @"Back";
self.navigationItem.backBarButtonItem = backButton;
Ответ 7
Ваша проблема, вероятно, очень похожа на описанную здесь: http://blog.tmro.net/2009/05/uitabbarbuttonitem-did-not-change-its.html
Попробуйте отладить, чтобы установить, есть ли какие-либо _barButtonItemFlags для вашей кнопки...
Ответ 8
Как упоминалось в предыдущем постере (Бренден), по умолчанию значение backBarButtonItem равно nil, поэтому его результаты заголовка отправляются в сообщение нильскому объекту, который, конечно же, игнорируется.
Если вы не хотите гасить вокруг, вручную создавая новую кнопку, чтобы установить свой заголовок, в Interface Builder есть работа.
В IB, для данного контроллера представления, который является частью стека навигационного контроллера, вы можете щелкнуть по элементу navigationItem, представляющему навигационную панель. Когда вы нажимаете, инспектор свойств позволяет вам установить три свойства: Title, Prompt и BackButton.
Если в поле backButton вы вводите любой старый случайный текст, это приводит к созданию экземпляра объекта backBarButtonItem и вашего кода, теперь вы можете установить его название для любого текста, который вы хотите.
Надеюсь, это поможет кому-то.
Ответ 9
Возможно, вы не хотите, чтобы каждый нажатый viewController из viewController имел кнопку "Отмена", чем просто установить элемент leftBarButtonItem в displayController с настраиваемым заголовком
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"back", @"") style:UIBarButtonSystemItemCancel target:self action:@selector(popViewController)] autorelease];
- (void)popViewController {
[self.navigationController popViewControllerAnimated:YES];
}
Ответ 10
Предполагается: в вашем контроллере навигации есть два ViewController:
RootViewController и DetailViewController.
-
Первый шаг:
Вы должны переопределить название RootViewController
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"backTitle" style:UIBarButtonItemStylePlain target:nil action:nil];
-
Второй шаг:
[self.navigationController pushViewController: detailVC animated: YES];
Это сделано! Вы увидите кнопку Back Button DetailViewController - это "backTitle"
Ответ 11
- (void)pushViewController:(UIViewController *)controller
withBackTitle:(NSString *)backTitle
animated:(BOOL)animated {
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:backTitle
style:UIBarButtonItemStyleDone
target:nil
action:nil];
[self.navigationController pushViewController:controller animated:animated];
}
работает.
Ответ 12
Это лучшее решение для этого, не устанавливайте заголовок navigationitem как обычно, как
self.navigationitem.title. Поместите этот код в родительский вид didload
CGRect frame = CGRectMake(0, 0, 320, 44);
UILabel *label = [[[UILabel alloc] initWithFrame:frame] autorelease];
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont boldSystemFontOfSize:20.0];
label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
label.textAlignment = UITextAlignmentCenter;
label.textColor = [UIColor whiteColor];
self.navigationItem.titleView = label;
label.text = @"My Navigation Bar";
Установив заголовок, как указано выше, фактический заголовок навигации будет равен нулю, поэтому заголовок задней панели автоматически будет "Назад"
Ответ 13
self.navigationController.navigationBar.backItem.title = @"TEXT";
Ответ 14
У меня есть интересное решение:
В методе, который переходит ко второму представлению (IBAction или didSelectRaw и т.д.), я перехожу к заголовку, который я хочу в заголовке элемента back, например: self.title = @"Inbox";
. Кроме того, я добавляю метод ViewWillApear для изменения названия, когда пользователь нажимает на основной заголовок.