Пользовательская кнопка «Назад» для NavigationController для каждого экрана

Я пытался создать подкласс класса UINavigationController для изменения таких вещей, как фоновое изображение, размер панели навигации, кнопка «Назад», шрифт заголовка и так далее. Через пару часов и много чтения я понял, что не должен создавать подкласс класса UINavigationController...

Я хотел бы иметь определенный дизайн и перенести этот дизайн на все экраны, которые используют мой пользовательский NavigationController...

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

Как я могу этого добиться? Может быть, с помощью категорий? Заранее спасибо.


person CSharpLearning    schedule 09.05.2012    source источник
comment
Сколько UINavigationController экземпляров у вас будет?   -  person Kai Huppmann    schedule 09.05.2012
comment
так зачем тогда возиться со сложными стратегиями?   -  person Kai Huppmann    schedule 09.05.2012


Ответы (4)


Я показываю код для пользовательской левой кнопки UINavigationcontroller. Вы можете добавить этот код в каждый контроллер представления и для обеих кнопок (правой и левой).

    leftButton = [UIButton buttonWithType:UIButtonTypeCustom];    
    [leftButton setImage:[UIImage imageNamed:@"Yourcutomeimage.png"] forState:UIControlStateNormal];    
    leftButton.frame = CGRectMake(0, 0, 30, 30);
    [leftButton addTarget:self action:@selector(youraction:) forControlEvents:UIControlEventTouchUpInside];  

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

//or

self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:leftButton]autorelease];

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

person Nitin    schedule 09.05.2012
comment
Я пытаюсь избежать конфигурации в каждом контроллере представления. Я хотел бы, чтобы он определял его только в одном месте и распространял модификации повсюду. - person CSharpLearning; 09.05.2012
comment
Хорошо, создайте один класс UIViewControllerBase и используйте его где угодно. Но в нижней строке вы можете настроить кнопку навигации, используя приведенный выше код. - person Nitin; 09.05.2012
comment
Спасибо за вашу помощь, вот что я пытаюсь сделать сейчас. Есть ли способ использовать селектор по умолчанию для кнопки «Назад» при объявлении собственной левой кнопки? Я хотел бы избежать добавления дополнительных методов. Другой вопрос: почему, если я использую UIBarButtonItem, я не могу установить заголовок для кнопки? - person CSharpLearning; 09.05.2012

Да, @Nit прав, это способ настроить UINavigationController, но если вы не хотите делать это для каждого имеющегося у вас UIViewController, вы можете создать класс UIViewControllerBase, который является подклассом UIViewController, и в методе viewDidLoad установите все ваши кнопки так, как описал @Nit, а затем сделайте каждый UIViewController, который вам нужен, подклассом вашего UIViewControllerBase класса.

person graver    schedule 09.05.2012
comment
Это действительно хорошая идея. Я пытался использовать спагетти-код везде. Спасибо. - person CSharpLearning; 09.05.2012

Если вы хотите добавить пользовательскую кнопку «Назад» в uinavigationcontroller, вы должны использовать navigationItem.backBarButtonItem и реализовать ее в классе, где вы инициализируете uinavigationcontroller. Образец :-

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"btnImage.png" style:UIBarButtonItemStyleBordered target:youtarget action:@sel(your action)];  
self.navigationItem.backBarButtonItem = backButton; [backButton release];
person Abhishek Singh    schedule 09.05.2012
comment
Что если UINavigationController инициализируется раскадровкой? (контроллер первого вида)? - person CSharpLearning; 09.05.2012

Я изложил свое решение в этом ответе: https://stackoverflow.com/a/16831482/171933

По сути, вы создаете категорию в UIViewController и вызываете один единственный метод в каждом viewWillAppear методе ваших контроллеров представления.

person Johannes Fahrenkrug    schedule 30.05.2013