Сделайте пользовательскую кнопку возврата для UINavigationController - PullRequest
4 голосов
/ 16 февраля 2012

Я разрабатываю приложение для iOS 4.2+. Я вложил в подкласс UINavigationController, чтобы вставить два UIImageView и сделать панель навигации похожей на другую. Все работает отлично, но у меня есть небольшая проблема. Я создал пользовательский UIBarButtonItem, и внутри своих контроллеров представления я добавил их:

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:backButton];

Это тоже работает, но проблема в том, что для этой работы мне нужно позвонить с:

 - (void)viewDidAppear:(BOOL)animated ;

Таким образом, она появляется только после анимации, и я вижу не настроенную кнопку за 1 секунду до того, как измененная кнопка заменит ее.

(я пытался с viewWillAppear, но потом ничего не добавлялось в панель навигации)

Я хотел бы знать, есть ли у вас решение, которое может решить эту проблему.

PS: я никогда не использую IB, все сделано программно.

Спасибо из Франции!

РЕДАКТИРОВАТЬ 1: вот код, который ничего не показывает для viewWillAppear:

- (void)viewWillAppear:(BOOL)animated  {
    [self setTitle:@"Jeu"];

    //Bouton testflight
    TIFButton *testFeedbackButton = [[TIFButton alloc]init];
    [testFeedbackButton setTitle: @"Envoyer un Feedback" forState:UIControlStateNormal];
    [testFeedbackButton addTarget:self action:@selector(launchFeedback) forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *testFeedback = [[UIBarButtonItem alloc] initWithCustomView:testFeedbackButton];

    self.navigationItem.rightBarButtonItem = testFeedback;  

    TIFBackButton *backButton = [[TIFBackButton alloc]init];
    [backButton setTitle: @"Retour" forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(popToPrecedentViewController) forControlEvents:UIControlEventTouchUpInside];

    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:backButton];
}

Ответы [ 3 ]

18 голосов
/ 16 февраля 2012

Допустим, у вас есть два контроллера ViewController, A и B, вы помещаете B в стек, когда A является самым верхним, и вы хотите настроить кнопку возврата, которая отображается, когда B находится сверху.

Как правило, способ сделать это состоит в том, чтобы установить ViewController A s navigationItem.backBarButtonItem.

Вместо этого вам нужно дать ViewController B пользовательскийКнопка на левой стороне панели навигации, установив ее navigationItem.leftBarButtonItem.

Этот подход хорошо реализован, за исключением того, что даже если вы не установите ViewController A 's navigationItem.backBarButtonItem по умолчанию вы по-прежнему получаете кнопку возврата по умолчанию.Так что эта кнопка, вероятно, появляется поверх вашей пользовательской кнопки возврата.

Если вы установите ViewController B * navigationItem.hidesBackButton = YES, то у вас не должно возникнуть никаких проблем.

И в будущем, когдаВы реализуете пользовательские кнопки возврата, вы должны сделать это, установив navigationItem.backBarButtonItem вместо navigationItem.leftBarButtonItem.Одна настройка, которую вам нужно будет сделать, заключается в том, что при таком подходе вы, например, используете ViewController A navigationItem, чтобы изменить кнопку возврата, которая появляется, когда ViewController B находится на вершине.

3 голосов
/ 19 декабря 2013
UIBarButtonItem *backButton = [UIBarButtonItem new];

[backButton setTitle:@"Back"];

[[self navigationItem] setBackBarButtonItem:backButton];

Этот код вы должны упомянуть в предыдущем контроллере вида, тогда только в следующем контроллере появилась кнопка возврата по умолчанию.

Наслаждайтесь !!!

1 голос
/ 30 мая 2013

Я придумал несколько универсальное решение: https://stackoverflow.com/a/16831482/171933 Он включает в себя категорию на UIViewController и требует минимального кода, чтобы иметь кнопку возврата изображения на всех ваших экранах.

...