2014-11-24 61 views
0

我有一个应用程序在首次启动时从远程源获取配置值。其中一个值是navigationBartintColor加载视图后的setBarTintColor

在我viewWillAppear我有这样的:

UINavigationBar *navigationBar = self.navigationController.navigationBar; 
[navigationBar setBarTintColor:[self UIColorFromRGB:config.navColor]]; 
[navigationBar setNeedsDisplay]; 
NSLog(@"Color after SND: %@", config.navColor); 

当应用程序启动后,此打印到控制台:

Color after SND: 39589a 

因此,barTintColor是预计蓝色。

当同步完成时,我手动调用viewWillAppear(以及viewDidLoad),并且接口中除barTintColor之外的所有内容都按预期调整。我也得到了我所期望的打印到控制台:

Color after SND: a1231c 

但barTintColor保持不变,直到我关闭应用程序,然后再次启动它(同步未重新触发时,应用程序启动第二次)。

任何想法,我失踪,以强制navigationBartintColor更新后,视图已经加载?

编辑: 明确的是,它不是UIColorFromRGB被干扰,我已经进行了两次测试:

  1. 此:NSLog(@"UIColor Result: %@", [UIColor redColor]);这个:NSLog(@"UIColor Result: %@", [self UIColorFromRGB:@"ff0000"]);都产生这样的:UIColor Result: UIDeviceRGBColorSpace 1 0 0 1

  2. 我加的这样:

    if(updateBarColor) { NSLog(@“setting to red”); UINavigationBar * navigationBar = self.navigationController.navigationBar; [navigationBar setBarTintColor:[UIColor redColor]]; [navigationBar setNeedsDisplay]; }

将预期消息打印到控制台,但没有改变导航栏的颜色。

+2

我真的不认为你应该调用'viewDidAppear'和'viewDidLoad'。 – 2014-11-24 16:40:24

+0

什么版本的iOS? setBarTintColor和setTintColor在不同的版本上做不同的事情。尝试调用setTintColor来代替/也看看它做了什么! – RobP 2014-11-24 18:37:29

+0

@RobP iOS 7.0,7.1和8.1。我和那些出于挫折的人一起玩,但实际上,他们不是一回事。 'barTintColor'是应用于酒吧背景的东西,'tintColor'是应用于导航项目和酒吧按钮项目的东西。 https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UINavigationBar_Class/index.html – 2014-11-24 18:54:05

回答

0

如果你的fireBarTinColor改变了,它会自动改变。为了在此之前

 UINavigationBar *navBar = self.navigationController.navigationBar; 
[navBar setBarTintColor: [UIColor blueColor]]; 

测试就知道,问题是你的方法:

您可以测试这一点,在任何诉讼UIColorFromRGB(在事情方法的其他顺序应该与小写开头)。

另一个问题是你是两个导航控制器嵌套。

+0

为了证明我有一个有效的'UIColor'从我自己的'UIColorFromRGB'返回,我添加了这个:'NSLog(@“UIColor after SND:%@”,[self UIColorFromRGB:config.navColor]);'初始启动记录了这个:'UIDolor在SND之后:UIDeviceRGBColorSpace 0.223529 0.345098 0.603922 1'在同步之后记录了这个:'UIColor在SND之后:UIDeviceRGBColorSpace 0.631373 0.137255 0.109804 1'但仍然没有颜色变化。我会同意它“应该”会使用'setBarTintColor'自动更改,但事实并非如此。这就是我发布的原因。 – 2014-11-24 17:08:29

+0

我不明白“你是两个导航控制器嵌套。”你指的是我的变量是'navigationBar'吗?如果是这样,那现在是一个问题。 'self.navigationController.navigationBar'有它自己的作用域,加上(在奇思妙想中)我试着将变量名更改为别的东西,并且它没有任何影响。 – 2014-11-24 17:11:57

+0

对不起,你可以在你的代码中将[自UIColorFromRGB:config.navColor]改为:[UIColor redColor]? – 2014-11-24 17:29:52

0

那么,难倒我的是,所有的方法都是以正确的顺序触发,所有其他的UI元素正在被正确更新,所有东西都按照预期打印到控制台,并且我遵循了我可以在网上找到的所有建议。我错过的细节是更新过程(从远程源获取配置值)发生在后台线程上,显然,该特定的UI更改无法从后台线程触发。我在顶层视图控制器创建了一个新方法:

​​

然后调用它接收到所需的数据后:

[viewController performSelectorOnMainThread:@selector(updateBarColor) withObject:viewController waitUntilDone:NO];