Ios 加载视图后的SetPartIntColor

Ios 加载视图后的SetPartIntColor,ios,Ios,我有一个应用程序,它在初始启动时从远程源获取配置值。其中一个值是navigationBartintColor 在我的视图中将出现我有: UINavigationBar *navigationBar = self.navigationController.navigationBar; [navigationBar setBarTintColor:[self UIColorFromRGB:config.navColor]]; [navigationBar setNeedsDisplay]; NSLo

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

在我的
视图中将出现
我有:

UINavigationBar *navigationBar = self.navigationController.navigationBar;
[navigationBar setBarTintColor:[self UIColorFromRGB:config.navColor]];
[navigationBar setNeedsDisplay];
NSLog( @"Color after SND: %@", config.navColor );
当应用程序启动时,将打印到控制台:

Color after SND: 39589a
Color after SND: a1231c
因此,
BartinColor
是预期的蓝色

同步完成后,我手动调用
视图将出现
(以及
viewDidLoad
),界面中除
barTintColor
之外的所有内容都会按预期进行调整。我还获得了希望打印到控制台的内容:

Color after SND: 39589a
Color after SND: a1231c
但是BartinColor保持不变,直到我关闭应用程序并再次启动它(当应用程序第二次启动时不会重新触发同步)

在视图加载后,强制更新
navigationBar
tintColor
有什么想法吗

编辑: 为了明确干扰的不是
UIColorFromRGB
,我进行了两项测试:

  • 这:
    NSLog(@“UIColor结果:%@,[UIColor redColor])和此:
    NSLog(@“UIColor结果:%@,[self-UIColorFromRGB:@“ff0000]”)两者都会产生以下结果:
    UIColor结果:uiDeviceRbColorSpace 1 0 0 1

  • 我补充说:

    if(updateBarColor) { NSLog(@“设置为红色”); UINavigationBar*navigationBar=self.navigationController.navigationBar; [导航栏设置部分颜色:[UIColor REDCLOR]]; [导航栏设置需要显示]; }


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

    如果您触发导航栏颜色的更改,它将自动更改

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

         UINavigationBar *navBar = self.navigationController.navigationBar;
    [navBar setBarTintColor: [UIColor blueColor]];
    
    在此之前进行测试,以便知道问题出在您的方法:UIColorFromRGB(按照其他顺序,方法应以小写开头)


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

    好吧,让我感到困惑的是,所有方法都按正确的顺序启动,所有其他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];
    

    我真的不认为你应该自己调用
    viewdide
    viewdideload
    。什么版本的iOS?SetPartIntColor和setTintColor在不同版本上执行不同的操作。尝试调用setTintColor代替/同时调用,看看它能做什么@RobP iOS 7.0、7.1和8.1。我是出于沮丧才和他们一起玩的,但事实上,他们不是一回事
    barTintColor
    是应用于条形图背景的内容,
    tintColor
    是应用于导航项和条形图按钮项的内容@LordZsolt也许你是对的,但是另一种选择是将相同的代码放在它自己的方法中,并从这个位置和viewDidLoad/ViewWillExisten调用该代码。其中6个。。。我确实看到人们在互联网上说,“苹果说不要这样做”,但我在任何地方都找不到苹果真的这么说。如果你能提供一个苹果文档的链接,指出这是一个坏主意(或者是一个写得很好、研究得很好的反对它的论点),我会改变我的错误。为了证明我有一个有效的
    UIColor
    从我自己的
    UIColorFromRGB
    返回,我添加了以下内容:
    NSLog(@“UIColor after SND:%@),[self-UIColorFromRGB:config.navColor]);
    最初发布时记录了以下内容:
    UIColor-after-SND:UIDeviceRGBColorSpace 0.223529 0.345098 0.603922 1
    同步后记录此:
    UIColor-after-SND:UIDeviceRGBColorSpace 0.631373 0.137255 0.109804 1
    ,但仍然没有颜色更改。我同意它“应该”使用
    setPartIntColor
    自动更改,但它没有。这就是我发布的原因。我不理解“你是两个嵌套的导航控制器”。你是指我的变量是
    navigationBar
    ?如果是,那现在是个问题。
    self.navigationController.navigationBar
    有自己的作用域,而且(一时兴起)我已尝试将变量名称更改为其他名称,但没有任何影响。很抱歉,您可以在代码中将此[self-UIColorFromRGB:config.navColor]文本更改为[UIColorRedColor]?更多内容,您不需要[navigationBar setNeedsDisplay];。我制作了一个简单的应用程序,带有一个按钮和它的动作,并且只按以下行的按钮:self.navigationController.navigationBar.barTintColor=[UIColor redColor],自动更改颜色。为了找到错误:您必须执行以下操作:1.-记录导航控制器并查看其存在:NSLog(@“我的导航控制器%@),[self.navigationController description]);2.-隐藏导航栏,更改视图中的颜色后将显示。