我有一个应用程序在初始启动时从远程源获取配置值。其中一个值是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
干扰,我已经进行了两次测试:
这:NSLog( @"UIColor Result: %@", [UIColor redColor] );
而且:NSLog( @"UIColor Result: %@", [self UIColorFromRGB:@"ff0000"] );
都产生了这个:UIColor Result: UIDeviceRGBColorSpace 1 0 0 1
我补充说:
if(updateBarColor) { NSLog(@“设置为红色”); UINavigationBar * navigationBar = self.navigationController.navigationBar; [navigationBar setBarTintColor:[UIColor redColor]]; [navigationBar setNeedsDisplay]; }
将预期的消息打印到控制台,但没有改变导航栏的颜色。
答案 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];