Обновить внешний вид UINavigationBar?

В моем приложении iPad у меня есть представление настроек приложения. Один из параметров позволяет пользователю переключаться с цветовой схемой интерфейса. Представление настроек загружается segue в отдельный контроллер просмотра, чем мое "основное" окно приложения.

Когда они выбирают новый цвет, я переключаю переменную colorSchemeColor и делаю это:

// set the colors and refresh the view
[[UINavigationBar appearance] setBarTintColor:colorSchemeColor];
[[UIToolbar appearance] setBarTintColor:colorSchemeColor];
[[UITabBar appearance] setBarTintColor:colorSchemeColor];

Однако ни один из баров не меняет цвет, пока не выйду из окна настроек! (Когда окно настроек исчезает, цвета для основного приложения меняются правильно!)

Итак, я попытался поместить этот код сразу после обновления представления настроек:

[self.view setNeedsDisplay];
[self.view setNeedsLayout];

что не помогло. Поэтому я добавил также:

[self.navigationController.view setNeedsDisplay];
[self.navigationController.view setNeedsLayout];

Это тоже не сработало.

Как я могу получить представление настроек для "перерисовать" себя при выборе нового цвета, чтобы изменение стало очевидным?

Большое спасибо!

Ответ 1

Прокси-сервер внешнего вида влияет только на внешний вид новых инициализированных представлений. Установка цветов в прокси-сервере внешнего вида не влияет на видимые полосы навигации.

Вам нужно будет вручную обновить текущий вид; например:

self.navigationController.navigationBar.barTintColor = [UINavigationBar appearance].barTintColor;

Ответ 2

В то время как я думаю, что Aaron Brager отвечает, это идеальная оценка, моему приложению требуется около 15 различных параметров внешнего вида и использует контроллер разделенного вида, поэтому мне нужно повторно применить все настройки к глобальному виду, а затем применить их все к моим двум отображаемым Просмотры. Это много избыточного кода.

Основываясь на идее, что представление и отклонение контроллера модального представления вынуждает все под ним перерисовывать, я пробовал это, и он отлично работал:

UIViewController *redrawTrigger = [[UIViewController alloc] init];
redrawTrigger.modalPresentationStyle = UIModalPresentationFullScreen;
[mySplitViewController presentModalViewController:redrawTrigger animated:FALSE];
[mySplitViewController dismissModalViewControllerAnimated:FALSE];
[redrawTrigger release];

Ответ 3

Objective-C:

self.navigationController.navigationBarHidden = YES;
self.navigationController.navigationBarHidden = NO;

Swift:

self.navigationController?.isNavigationBarHidden = true
self.navigationController?.isNavigationBarHidden = false