Сделайте пользовательскую кнопку возврата для UINavigationController

Я разрабатываю приложение для 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 ответа

Решение

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

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

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

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

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

И в будущем, когда вы реализуете пользовательские кнопки "Назад", вы должны сделать это, установив navigationItem.backBarButtonItem вместо navigationItem.leftBarButtonItem, Единственное, что вам нужно сделать, это то, что при таком подходе вы, например, будете использовать ViewController AnavigationItem изменить кнопку назад, которая появляется, когда ViewController B находится сверху.

UIBarButtonItem *backButton = [UIBarButtonItem new];

[backButton setTitle:@"Back"];

[[self navigationItem] setBackBarButtonItem:backButton];

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

Наслаждаться!!!

Я придумала несколько универсальное решение: /questions/39909252/iphone-polzovatelskij-uibarbuttonitem-dlya-knopki-nazad/39909262#39909262 Оно включает в себя категорию на UIViewController и требует минимального кода, чтобы кнопка возврата изображения была на всех ваших экранах.

Другие вопросы по тегам