0

我在显示MFMailComposeViewController时通过调用setBackgroundImage来重置NavigationBar的背景图像。但是当我尝试通过在mailComposeController:didFinishWithResult:中第二次调用setBackgroundImage将图像重置为原始图像时,它不会明显更改背景图像。UINavigationBar setBackgroundImage有时不会立即生效

奇怪的是,日志显示我的导航栏的背景图片已经改变,以后我弹出了几个视图控制器(我不知道这是模式的转变,哪些不是,因为它是人其他的代码),背景图片终于确实更改。但为什么它不立即改变?

这里是我的相关代码中mailComposeController:didFinishWithResult:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"img"] 
            forBarMetrics:UIBarMetricsDefault]; 
NSLog(@"Navbar img = %@", [[UINavigationBar appearance] 
          backgroundImageForBarMetrics:UIBarMetricsDefault]); 

回答

1

另一个建议是,确保你设置的背景图像后,你已经驳回了mailComposeController和自己的视图控制器已经变得活跃起来。

0

你确定你的-mailComposeController:didFinishWithResult:是被称为主线程上,你需要做的所有的UI工作的?

尝试在主线程上执行-setBackgroundImage:forBarMetrics:调用,看看是否有帮助。

例如:

dispatch_async(dispatch_get_main_queue(), ^{ 
     [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"img"] 
             forBarMetrics:UIBarMetricsDefault]; 
    }); 
+0

感谢@Alex的帮助 - 我不确定它是否在主线程中调用,但在'mailComposeController:didFinishWithResult'中添加'dispatch_async'块并没有改变行为。 – Josh

+0

@Josh 这是值得一击:) 我看的另一个地方是确保你设置的背景图像 - 之后,你已经解雇了mailComposeController和-after-你自己的视图控制器已经再次变得活跃。 –

+0

这对我有效!诀窍是在调用mailComposeController的视图控制器中的'viewWillAppear'内调用'setBackgroundImage'。你可以把它作为答案发布,以便我可以接受它吗? – Josh