2013-08-26 2 views
10

Я пытаюсь установить кнопку BACK для нажатого VC набора в стек UINavigationController. Я использую следующий код, и он не работает. Я все еще получаю предыдущее имя VC, которое отображается как название кнопки.iOS >> UINavigation Item Back Button Название не меняется

-(void)viewWillAppear:(BOOL)animated { 

    [super viewWillAppear:animated]; 

    self.title = @"VC Title"; 

    UIBarButtonItem* myBackButton = [[UIBarButtonItem alloc] 
            initWithTitle:@"Back" 
            style:UIBarButtonItemStyleBordered 
            target:nil 
            action:nil]; 

    self.navigationItem.backBarButtonItem = myBackButton; 

} 

Кто-нибудь?

ответ

16

Попробуйте установить заголовок в контроллер представления родителя viewDidLoad

UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(popView)]; 

self.navigationItem.leftBarButtonItem = customBarItem; 
+3

Спасибо chris13. Так оно и было. Странно, хотя это self.navigationItem относится к следующему VC, а не к текущему активному ... Любая идея, почему или, может быть, у вас есть ссылка на хорошее объяснение по этому поводу? –

+1

Я также думаю, что это странно, но Apple Docs делают это немного понятнее. Пожалуйста, примите ответ, если это вам помогло;) – chris13

+4

Это не работа в iOS 7. – zgjie

12

Из документации Apple:

Панель кнопок пункт на левой стороне панели навигации позволяет для навигации обратно к предыдущему контроллеру представления в стеке навигации. Контроллер навигации обновляет левую сторону навигационной панели следующим образом:

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

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

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

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

+0

Спасибо, johnyu. Но если я беру первый вариант установки настраиваемого barButton в качестве параметра navigationItem.leftBarButtonItem, он не будет иметь форму обратной кнопки «стрелка» по умолчанию. Любая идея, как это решить? –

+0

+1 Вот ссылка: Обновление панели навигации https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006934- CH3-SW25 – situee

+0

Спасибо! Наконец, мне удалось дать поведение, которое я хотел использовать для моей кнопки. –

17

в контроллере представления родительском:

- (void)viewWillDisappear:(BOOL)animated 
{ 
    self.title = @"Back"; 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    self.title = @"Title of your navigation bar"; 
} 

будет делать трюк

+0

Приятный забавный трюк, но он работает! :) – NightFury

+0

Гений! Благодаря! –

+0

превосходный трюк ... умный кодер .. –

3
self.navigationItem.hidesBackButton = YES; 
self.navigationItem.leftBarButtonItem =[[UIBarButtonItem alloc] initWithTitle:@"Put Any Title" 
             style:UIBarButtonItemStyleBordered 
            target:nil 
            action:nil]; 
0

Еще одно решение, которое очень быстро.

Переопределите этот метод в вашем контроллере базового представления, и на каждом нажатом контроллере появится кнопка возврата. (Только не добавьте [super setTitle:title])

- (void)setTitle:(NSString *)title 
{ 
    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 44)]; 
    [lbl setText:title]; 
    [lbl setTextColor:[UIColor whiteColor]]; 
    [self.navigationItem setTitleView:lbl]; 
} 
0

для раскадровки;

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

для решения кода;

UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithTitle:@"back off" style:UIBarButtonItemStyleBordered target:self action:@selector(popView)]; 
[[self navigationItem] setBackBarButtonItem:customBarItem]; 
0

Вы можете использовать эту функцию (в ViewController, который показывает кнопку назад)

UINavigationController *nvc = self.navigationController; 
NSInteger currentViewControllerIndex = [nvc.viewControllers indexOfObject:self]; 

if (currentViewControllerIndex > 0) { 
    UIViewController *previousViewController = self.navigationController.viewControllers[currentViewControllerIndex - 1]; 
    previousViewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:backButtonTitle style:UIBarButtonItemStylePlain target:nil action:nil]; 
} 

На быстрой

if let currentViewControllerIndex = self.navigationController?.viewControllers.indexOf(self) where currentViewControllerIndex > 0, 
    let previousViewController = self.navigationController?.viewControllers[currentViewControllerIndex - 1] { 
     previousViewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: backButtonTitle, style: .Plain, target: nil, action: nil) 
}