弹出视图时不恢复自定义导航栏背景

Posted

技术标签:

【中文标题】弹出视图时不恢复自定义导航栏背景【英文标题】:Custom nav bar background is not restored when popping view 【发布时间】:2011-11-29 23:13:07 【问题描述】:

我的导航工具栏有问题。我在我的应用程序委托中设置导航工具栏背景图像,然后有一个按钮,单击该按钮会更改导航工具栏背景图像并移动到另一个视图。

这很好用,但是,当我点击后退按钮并返回原始视图时,导航工具栏背景图像不会变回来。

以下是相关代码:

在我的第一个视图控制器中:

- (void)viewDidLoad

    [super viewDidLoad];

    //set to change the navigation toolbar to this background image (the first) when this view loads
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"QuickGrocery Logo Updated.jpg"] forBarMetrics:UIBarMetricsDefault];

按钮操作:

    - (IBAction)wellBalancedMealsClicked:(id)sender 

    QuickGroceryMasterViewController *masterViewController = [[QuickGroceryMasterViewController alloc] initWithNibName:@"QuickGroceryMasterViewController" bundle:nil];

    [masterViewController setRecipeChoice:1];

//changes the navigation toolbar background image
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"Keep It Balanced.jpg"] forBarMetrics:UIBarMetricsDefault];

【问题讨论】:

您的代码无法正常工作的原因是在返回您的第一个视图控制器时没有调用viewDidLoad。仅当从 nib 加载视图控制器的视图时才调用此方法。 Rob Mayoff 的回答是最好的解决方案。 【参考方案1】:

导航栏只有一张图片。如果你改了,以后又想改回来,就得自己改回来。

我建议你给你的每个视图控制器一个navigationBarImage 属性。为您的导航控制器设置一个委托。在委托中,添加这个方法:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated

    UIImage *image = [(id)viewController navigationBarImage];
    if (image)
        [navigationController.navigationBar setBackgroundImage:image forBarMetrics: UIBarMetricsDefault];

【讨论】:

罗布,感谢您的帮助。如何为导航控制器“设置委托”? 将导航控制器的delegate 属性设置为实现navigationController:willShowViewController: 的类的实例。 Cocoa Core Competencies: Delegation 或者你的意思是“App Delegate” 导航控制器可以有一个委托。该委托可以是与应用委托相同的对象,也可以是不同的对象。

以上是关于弹出视图时不恢复自定义导航栏背景的主要内容,如果未能解决你的问题,请参考以下文章

当导航栏是超级视图视图时,如何在导航栏后面放置视图?

使自定义viewcontroller覆盖导航栏

自定义导航栏 titleView 在加载新标题之前不会清除以前的标题

如何删除自定义导航栏图像?

iOS 导航栏-返回按钮-自定义

带背景的自定义导航栏