简体   繁体   中英

Make a custom back button for UINavigationController

I'm developping an app for iOS 4.2+. I subclassed my UINavigationController to insert two UIImageView and make the navigation bar look custom. Everything is working great but I have a little problem. I created custom UIBarButtonItem and inside my view controllers i put them with :

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

It works too but the problem is that to make this work I need to call it from:

 - (void)viewDidAppear:(BOOL)animated ;

So it only appears after the animation and I can see the non customized button 1 second before the customized one replace it.

(I tried with viewWillAppear but then nothing append in navigationbar)

I would like to know if you have a solution that could correct this problem.

PS: I never use IB, everything is made programmatically.

Thanks from France !

EDIT 1: here is the code that didn't show anything for 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];
}

Let's say you have two ViewControllers, A and B, you're pushing B onto the stack when A is topmost, and you want to customize the back button that shows up when B is on top.

Typically, the way to do this is to set ViewController A 's navigationItem.backBarButtonItem .

Instead, what you're doing is to give ViewController B a custom button on the left side of the navbar by setting its navigationItem.leftBarButtonItem .

You've implemented that approach fine, except that even if you don't set ViewController A 's navigationItem.backBarButtonItem , by default you still get a default back button as well. So that button is probably showing up on top of your custom back button.

If you set ViewController B's navigationItem.hidesBackButton = YES then you shouldn't have any problem.

And in the future, when you implement custom back buttons, you should do it by setting navigationItem.backBarButtonItem instead of navigationItem.leftBarButtonItem . The one adjustment you'll have to make is that with this approach, for example you would use ViewController A 's navigationItem to change the back button that shows up when ViewController B is on top.

UIBarButtonItem *backButton = [UIBarButtonItem new];

[backButton setTitle:@"Back"];

[[self navigationItem] setBackBarButtonItem:backButton];

This code you have to mentioned in previous view controller then only it default back button came in next view controller.

Enjoy!!!

我提出了一个有点通用的解决方案: https//stackoverflow.com/a/16831482/171933它涉及UIViewController上的一个类别,并且需要最少的代码才能在所有屏幕上都有一个图像后退按钮。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM