为UINavigationController制作一个自定义后退button

我正在开发iOS 4.2+的应用程序。 我subclassed我的UINavigationController插入两个UIImageView ,并使导航栏外观自定义。 一切都很好,但我有一个小问题。 我创build了自定义的UIBarButtonItem并在我的视图控制器,我把他们:

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

它的工作原理也是如此,但问题是,要做到这一点,我需要从以下位置调用它:

  - (void)viewDidAppear:(BOOL)animated ; 

所以它只出现在animation之后,我可以看到非定制的button1秒之前定制的一个取代它。

(我试着viewWillAppear但没有在导航栏中追加)

我想知道你是否有解决scheme可以纠正这个问题。

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]; } 

假设您有两个ViewController,A和B,当A是最顶层的时候,您将B推入堆栈,并且您想要定制当B处于顶层时显示的后退button。

通常情况下,执行此操作的方法是设置ViewController AnavigationItem.backBarButtonItem

相反,你正在做的是通过设置其navigationItem.leftBarButtonItem给ViewController B一个自定义button在左侧的导航栏。

你已经实现了这个方法,除了即使你没有设置ViewController AnavigationItem.backBarButtonItem ,默认情况下你仍然会得到一个默认的后退button。 所以这个button可能会显示在您的自定义后退button之上。

如果你设置ViewController B的navigationItem.hidesBackButton = YES那么你不应该有任何问题。

而在将来,当你实现自定义后退button,你应该通过设置navigationItem.backBarButtonItem来代替navigationItem.leftBarButtonItem 。 你必须做的一个调整就是用这种方法,例如你可以使用ViewController AnavigationItem来改变当ViewController B在最前面时显示的后退button。

 UIBarButtonItem *backButton = [UIBarButtonItem new]; [backButton setTitle:@"Back"]; [[self navigationItem] setBackBarButtonItem:backButton]; 

这个代码,你必须在前面的视图控制器中提到,然后只有它的默认后退button进入下一个视图控制器。

请享用!!!

我想出了一个有点通用的解决scheme: https : //stackoverflow.com/a/16831482/171933它涉及UIViewController类别,并需要最less的代码,在所有的屏幕上有一个图像返回button。