为 UINavigationController 制作自定义后退按钮

Posted

技术标签:

【中文标题】为 UINavigationController 制作自定义后退按钮【英文标题】:Make a custom back button for UINavigationController 【发布时间】:2012-02-15 20:05:56 【问题描述】:

我正在为 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];

【问题讨论】:

应该viewWillAppear一起工作,但是你的backButton视图需要在你分配self.navigationItem.leftBarButtonItem之前被实例化/创建。 为什么需要从viewDidAppear调用它?为什么它不能从 viewDidLoad 工作? 【参考方案1】:

假设您有两个 ViewController,A 和 B,当 A 位于最顶部时您将 B 推入堆栈,并且您想要自定义 B 位于顶部时显示的后退按钮。

通常,这样做的方法是设置 ViewController AnavigationItem.backBarButtonItem

相反,您所做的是通过设置其navigationItem.leftBarButtonItem,在导航栏左侧为 ViewController B 提供一个自定义按钮。

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

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

将来,当您实现自定义后退按钮时,您应该通过设置navigationItem.backBarButtonItem 而不是navigationItem.leftBarButtonItem 来实现。您必须进行的一项调整是,使用这种方法,例如,您将使用 ViewController AnavigationItem 更改 ViewController B 时显示的后退按钮strong> 位居榜首。

【讨论】:

谢谢,我解决了这个问题。你说的一切都是对的,这真的很有帮助,但我发现了阻止 UIBarButton 显示的错误。实际上,我在子类中添加的 UIImageView 在使用 viewWillAppear 调用时“隐藏”了按钮。所以两个问题,每个都解决了。再次感谢您! 这种方法的问题是您不能将后退按钮设置为自定义视图。你能做的最好的就是改变背景图像。如果您想更好地控制按钮的外观,您似乎必须像 OP 一样在 ViewController B 上设置 leftBarButtonItem。 对我有用的是B.navigationItem.hidesBackButton = YESB.navigationItem.leftBarButtonItem = <my custom button>【参考方案2】:
UIBarButtonItem *backButton = [UIBarButtonItem new];

[backButton setTitle:@"Back"];

[[self navigationItem] setBackBarButtonItem:backButton];

您必须在上一个视图控制器中提到此代码,然后只有默认的后退按钮出现在下一个视图控制器中。

享受!!!

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于为 UINavigationController 制作自定义后退按钮的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 在 UINavigationController 中将 UIViewController 显示为全屏

无法将 LaunchViewController 转换为 UINavigationController

将背景设置为透明后的iOS UINavigationController显示黑屏

为 UINavigationController 设置默认的 rightBarButtonItem

UINavigationController 和 titleView

IBM Worklight - 是不是可以将 UINavigationController 添加为起始本机页面?