2014-11-24 60 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];