Пользовательская кнопка возврата на панели навигации - PullRequest
8 голосов
/ 22 ноября 2011

В моем приложении много UIViewControllers с UINavigationControllers.На UINavigationBar должна быть кнопка «назад» и «home» UIButton.Все это прекрасно работает.

Но некоторые из моих UIViewControllers имеют длинные имена, и иногда для этого остается слишком мало места.Я пытаюсь заменить исходный ярлык кнопки «назад» (показывает заголовок предыдущего представления) на пользовательский «Назад», но все, что я пробовал, не сработало:* И мне нужно, чтобы кнопка «назад» имела стиль, как в этом вопросе: Рисование пользовательской кнопки «Назад» на панели навигации iPhone

Ответы [ 6 ]

50 голосов
/ 22 ноября 2011

Попробуйте следующее. Это точно будет работать:

- (void)viewDidLoad {
    [super viewDidLoad];

    UIImage *buttonImage = [UIImage imageNamed:@"back.png"];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setImage:buttonImage forState:UIControlStateNormal];
    button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height);
    [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];
    self.navigationItem.leftBarButtonItem = customBarItem;
    [customBarItem release];
}

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

Убедитесь, что в папке ресурсов с изображением back.png.

есть изображение кнопки размером с кнопку возврата на панели навигации.

Не стесняйтесь, если требуется какая-либо другая помощь.

7 голосов
/ 24 февраля 2014

Цель: настройка кнопки «Назад» на UINavigationBar на белый значок

Шаги: 1. в методе "didFinishLaunchingWithOptions" в AppDelete:

UIImage * backBtnIcon = [UIImage imageNamed: @ "navBackBtn"];

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [UINavigationBar appearance].tintColor = [UIColor whiteColor];
    [UINavigationBar appearance].backIndicatorImage = backBtnIcon;
    [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon;
}else{

    UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
}

2.в методе "viewDidLoad" общего класса super ViewController:

 if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                     style:UIBarButtonItemStylePlain
                                                                    target:nil
                                                                    action:nil];
        [self.navigationItem setBackBarButtonItem:backItem];
    }else{
        //do nothing
    }
6 голосов
/ 22 ноября 2011

Попробуйте это

UIBarButtonItem *backBarBtnItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(popViewController)];
[self.navigationItem setBackBarButtonItem:backBarBtnItem];

- (void)popViewController
{
    [self.navigationController popViewControllerAnimated:YES];
}
2 голосов
/ 19 октября 2013

Если вы делаете это повсеместно, как и я, вам лучше реализовать решение Anil как категорию:

@interface UIViewController (CustomBackButton)

- (void) setCustomBackButton;
- (void) back;

@end

@implementation UIViewController (CustomBackButton)

- (void) setCustomBackButton
{
    UIImage *buttonImage = [UIImage imageNamed:@"back.png"];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setImage:buttonImage forState:UIControlStateNormal];
    button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height);
    [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];
    self.navigationItem.leftBarButtonItem = customBarItem;
}

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

@end
1 голос
/ 06 февраля 2014

Проще:

UIBarButtonItem *barBtnItem = 
  [[UIBarButtonItem alloc]initWithTitle:@"Indietro"
                                  style:UIBarButtonItemStyleBordered
                                 target:self
                                 action:@selector(pop)];
[barBtnItem setTintColor:[UIColor whiteColor]];
self.navigationItem.leftBarButtonItem = barBtnItem;
0 голосов
/ 16 июня 2014

Предположим, у вас есть два контроллера - Controller1 и Controller2.Контроллер2 выталкивается из Контроллера1.Поэтому, прежде чем нажать Controller2 на навигационный контроллер из Controller1

Controller2 *controller2 = [[[Controller2 alloc]  init]autorelease];
self.navigationItem.hidesBackButton = YES;   

Теперь, в viewDidLoad: метод Controller2, добавьте следующий фрагмент

UIBarButtonItem *backBarButtonItem =[[[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(goBackToAllPets:)]autorelease];
self.navigationItem.leftBarButtonItem = backBarButtonItem;

и в метод backButtonClicked, вы можетевыполнить проверки, которые вы хотите.

...