2014-11-24 3 views
0

У меня есть приложение, которое захватывает значения конфигурации из удаленного источника при первоначальном запуске. Одно из этих значений является navigationBartintColorsetBarTintColor после просмотра загружается

В моей 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 обновить после того, как представление уже загружено?

EDIT: Чтобы быть ясно, что это не UIColorFromRGB, что мешает, я выполнил два теста:

  1. Это: NSLog(@"UIColor Result: %@", [UIColor redColor]); и это: NSLog(@"UIColor Result: %@", [self UIColorFromRGB:@"ff0000"]); как произвести это: UIColor Result: UIDeviceRGBColorSpace 1 0 0 1

  2. Я добавил:

    если (обновлениеBarColor) { NSLog (@ "настройка на красный"); UINavigationBar * навигацияBar = self.navigationController.navigationBar; [навигацияBar комплектBarTintColor: [UIColor красныйColor]]; [навигацияBar комплектNeedsDisplay]; }

помещавший ожидаемое сообщение на консоль, но не изменить цвет панели навигации.

+2

Я действительно не думаю, что вы должны называть 'viewDidAppear' и 'viewDidLoad' самостоятельно. –

+0

какая версия iOS? setBarTintColor и setTintColor делают разные вещи в разных версиях. Попробуйте вызвать setTintColor вместо/и посмотреть, что он делает! – RobP

+0

@RobP iOS 7.0, 7.1 и 8.1. Я играл с теми, кто разочарован, но, на самом деле, это не одно и то же. «barTintColor» - это то, что применяется к фону панели, а «tintColor» - это то, что применяется к элементам навигации и элементам кнопок панели. https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UINavigationBar_Class/index.html –

ответ

0

Если ваш огонь изменит навигациюBarTinColor, он автоматически изменится.

Вы можете проверить это, в любом действии:

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

тест это прежде для того, чтобы знать, что проблема заключается ваш метод: UIColorFromRGB (в другом порядке вещей метод должен начинаться в нижнем регистре).

Другая проблема заключается в том, что вы два контроллера навигации вложенные.

+0

Чтобы доказать, что у меня был действительный 'UIColor', возвращающийся из моего собственного' UIColorFromRGB', я добавил следующее: 'NSLog (@" UIColor после SND:% @ ", [self UIColorFromRGB: config.navColor]);' И начальный запуск запустил это: 'UIColor после SND: UIDeviceRGBColorSpace 0.223529 0.345098 0.603922 1' После синхронизации записал это:' UIColor после SND: UIDeviceRGBColorSpace 0.631373 0.137255 0.109804 1', но все еще нет изменения цвета. Я согласен с тем, что он «должен» автоматически меняться с помощью setBarTintColor, но это не так. Вот почему я опубликовал. –

+0

Я не понимаю, «вы два контроллера навигации вложенные». Вы имеете в виду тот факт, что моя переменная является 'navigationBar'? Если это так, то теперь проблема. 'self.navigationController.navigationBar' имеет свою собственную область, плюс (по прихоти), я попытался изменить имя переменной на что-то еще, и это не повлияло. –

+0

Извините, вы можете изменить текст в своем коде этого [self UIColorFromRGB: config.navColor] на это: [UIColor redColor]? –

0

Ну, что меня задело, так это то, что все методы стреляли в правильном порядке, все остальные элементы пользовательского интерфейса были должным образом обновлены, все было напечатано на консоли, как и ожидалось, и я следил за всеми предложениями, которые я мог найти в Интернете ,Детали, которые я пропустил, это то, что процесс обновления (получение значений конфигурации из удаленного источника) происходил в фоновом потоке, и это изменение пользовательского интерфейса, по-видимому, не может быть вызвано из фонового потока. Я создал новый метод в моем верхнем уровне контроллера зрения:

-(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]; 
Смежные вопросы