加载视图后的setBarTintColor

时间:2014-11-24 16:29:22

标签: ios

我有一个应用程序在初始启动时从远程源获取配置值。其中一个值是navigationBar tintColor

在我的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保持不变,直到我关闭应用程序并再次启动它(当应用程序第二次启动时不会重新触发同步)。

在视图加载后强制navigationBar tintColor更新我缺少的任何想法?

修改 要明确它不是UIColorFromRGB干扰,我已经进行了两次测试:

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

  2. 我补充说:

    if(updateBarColor) {    NSLog(@“设置为红色”);    UINavigationBar * navigationBar = self.navigationController.navigationBar;    [navigationBar setBarTintColor:[UIColor redColor]];    [navigationBar setNeedsDisplay]; }

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

2 个答案:

答案 0 :(得分:0)

如果你触发了navigationBarTinColor的更改,它会自动更改。

您可以在任何操作中对此进行测试:

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

之前测试这个以便知道问题是你的方法:UIColorFromRGB(以其他顺序的方法应该从小写开始)。

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

答案 1 :(得分:0)

好吧,让我感到困惑的是,这些方法都按照正确的顺序触发,所有其他UI元素都正在更新,所有内容都按照预期打印到控制台,我遵循了我可以在网上找到的所有建议。我错过的细节是更新过程(从远程源获取配置值)发生在后台线程上,显然,无法从后台线程触发特定的UI更改。我在顶级视图控制器中创建了一个新方法:

-(void)updateBarColor
{
    SFConfig *freshConfig = [[SFConfig alloc] init];
    UINavigationBar *navBar = self.navigationController.navigationBar;
    [navBar setBarTintColor:[self UIColorFromRGB:freshConfig.navColor]];
}

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

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