2009-01-31 3 views
29

У меня есть приложение, ориентированное на navigationController. Я хочу изменить заголовок кнопки «Назад» для контроллера корневого представления. Я попытался следующий код в методе viewDidLoad в RootViewController, но не успех:Изменение названия UIBackButtonItem

self.navigationItem.backBarButtonItem.title = @"Back"; 

Любые идеи?

ответ

45

Название кнопки возврата либо:

  1. Название предыдущего контроллера представления
  2. Имя элемента навигации кнопки

предыдущего контроллера представления обратно Если вы устанавливаете обратно для элемента навигации текущего контроллера просмотра, вы не устанавливаете кнопку, которая отображается в текущем представлении. Фактически вы устанавливаете кнопку «Назад», которая будет использоваться, если вы вытащите из нее еще один контроллер.

+3

Это что-то запутанное, но важное. При установке кнопки «Назад» элемента навигации контроллера вы фактически устанавливаете заголовок для кнопки «Назад», отображаемой контроллером на один уровень вниз по иерархии контроллера, то есть контроллер, нажатый контроллером, чья кнопка «Назад» - re. – duci9y

+0

Отлично! Вот как вы можете изменить название кнопки «Назад» после нажатия кнопки UIViewController (2. Название предыдущей кнопки навигации навигационного элемента предыдущего контроллера). Thanx! – derpoliuk

+0

Это объясняет так много.Никогда не любил UINavigationBar так или иначе –

51

я имел успех, создав свой собственный UIBarButtonItem вместо того, чтобы название существующего:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil]; 
self.navigationItem.backBarButtonItem = backButton; 
[backButton release]; 
+0

Но разве это не создает кнопку с квадратным стилем вместо стиля обратного треугольника? – Marco

+3

Нет, он делает совершенно нормальную оглядывающуюся кнопку, как стрелка, указывающая налево. –

+1

Это не работает. – CodingWithoutComments

1

Вы не можете просто изменить название кнопки возврата в контроллере представления корня, так как Корневой контроллер не отображает кнопку «Назад». В конце концов, это корень, к чему вы можете вернуться? Хотя в вашем приложении может быть что-то логичное, нет ничего очевидного в реализации по умолчанию.

Вы можете разместить там пользовательскую кнопку вместо того, чтобы вам действительно нужен элемент управления (создать UIBarButtonItem и установить для него navigationItem.backBarButtonItem), хотя это не будет иметь тот же вид, что и один из стандартных (он будет быть квадратом, в отличие от стрелки).

+0

Корневой вид имеет кнопку «Назад». Он отображается, когда он является «предыдущим» представлением в стеке. Другими словами, вы увидите это, когда вы нажмете другой вид. Правильно? –

+0

Нет, когда rootViewController является предыдущим в стеке, по умолчанию используется для того, чтобы заголовок кнопки childViewControllers был установлен на имя его родителей. –

0

Ваша проблема, вероятно, очень похож на описанный здесь: http://blog.tmro.net/2009/05/uitabbarbuttonitem-did-not-change-its.html

Try для отладки, чтобы увидеть, если есть какие-либо _barButtonItemFlags, установленные для вашей кнопки ...

+0

Это не имеет никакого отношения к этой ссылке! Эти проблемы включают в себя сброс названия кнопки навигации НАЗАД программно, в ответ на действие пользователя по выбору ячейки, а затем снова выбор кнопки «Назад». – PostCodeism

25

Возможно, уже ответил, но не просто.

self.navigationItem.backBarButtonItem по умолчанию nil. Поэтому, если вы установите для него заголовок, ничего не произойдет, потому что это влияет на адресный объект nil. Это не приведет к ошибке, поскольку объектив-c позволяет отправлять сообщения nil объектов.

ОТВЕТ: Вы должны создать свой собственный объект кнопки, чтобы установить его название. Вы можете создать initWithTitle или создать его после этого.

PS - как упомянуто, backBarButtonItem влияет только на его дочерние представления, которые накладываются поверх него в стеке навигации. В зависимости от того, как вы создали свое приложение, корневой вид больше не может быть вытолкнут и не может иметь кнопку «Назад». Хотя, вы можете повлиять на leftBarButtonItem.

+0

спасибо за 'nil'. Я даже не пытался это проверить! – sergtk

-1

Это лучшее решение для этого, не устанавливайте заголовок 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"; 

Установив название, как указано выше фактического заголовка навигации будет ноль, так что название backbarbutton будет автоматически «Назад»

+0

Это очень крутой способ сделать это, и ваш заголовок больше не будет сосредоточен. –

5

Кнопка возврата тянет его текст из заголовка родительского контроллера представления.

В контроллере родительского представления (контроллер вида, который появляется при нажатии кнопки «Назад»), установите его собственный заголовок как нужный текст на кнопке «Назад».

Например, предположим, что у нас есть класс 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";

+0

Если бы это было так просто .... это не сработало. – PostCodeism

-1
self.navigationController.navigationBar.backItem.title = @"TEXT"; 
+0

Это не работает. – nemesys

-1

У меня есть интересное решение:

В методе, который ориентироваться на вторую точку зрения (IBAction или didSelectRaw и т.д.) меняю на титул, который я хочу в названии заднего элемента, например: self.title = @"Inbox";. Кроме того, я добавляю метод ViewWillApear для изменения названия, когда пользователь нажимает на основной заголовок.

+0

вы в основном описываете принятое решение другими словами. – alinoz

0

Как упоминалось в предыдущем постере (Бренден), значение backBarButtonItem по умолчанию равно нулю, поэтому его результаты заголовка отправляются в сообщение нильскому объекту, который, конечно, игнорируется.

Если вы не хотите обманывать вручную, создавая новую кнопку, чтобы установить ее заголовок, в Interface Builder есть работа.

В IB для данного контроллера вида, который является частью стека навигационного контроллера, вы можете щелкнуть по элементу navigationItem, представляющему навигационную панель. Когда вы нажимаете, инспектор свойств позволяет вам установить три свойства: Title, Prompt и BackButton.

Если в поле backButton вы вводите любой старый случайный текст, это может повлиять на создание объекта backBarButtonItem и вашего кода, теперь вы можете установить его заголовок для любого текста, который вы хотите.

Надеюсь, это поможет кому-то.

1

Ответы Михая Дамиана и Криса Лунди верны.

Еще одна вещь, которую следует отметить, заключается в том, что если вы измените свой navigationController navigationItem.title с помощью своего настраиваемого параметра navigationItem.backBarButtonItem, он вернется к своему состоянию по умолчанию, которое должно отменить ваш пользовательский backBarButtonItem и вместо этого использовать новый заголовок вы только что установили.

Таким образом, я могу гарантировать, что я заново установить backBarButtonItem всякий раз, когда я изменить заголовок ViewController в:

self.navigationItem.title = @"New Title"; 
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init]; 
backButton.title = @"Back"; 
self.navigationItem.backBarButtonItem = backButton; 
+0

Не забудьте поставить этот код в viewDidLoad: из контроллера представления, который собирается нажать контроллер вида с помощью элемента кнопки «Назад», который имеет нужный заголовок. Ввод этого кода в контроллер, который нажат, не будет работать. – nemesys

0

Может быть, вы не wan't каждый толкнул ViewController из ViewController имеют кнопку Отмена, чем просто набор leftBarButtonItem на дисплее ViewController с пользовательским названием

self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"back", @"") style:UIBarButtonSystemItemCancel target:self action:@selector(popViewController)] autorelease]; 

- (void)popViewController { 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
0

Успенском: в навигационном контроллере есть два ViewController является RootViewController и DetailViewController.

  • Первый шаг: Вы должны переопределить обратно титул RootViewController

    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"backTitle" style:UIBarButtonItemStylePlain target:nil action:nil]; 
    
  • Второй шаг:

    [self.navigationController pushViewController: detailVC анимированные: ДА];

Это сделано! Вы увидите кнопку «Назад» элемента DetailViewController is «backTitle»

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

Это работы.

Смежные вопросы