iOS 8: невозможно изменить панель навигации вообще из ABPeoplePickerNavigationController
Я пытаюсь изменить цвет панели навигации ABPeoplePickerNavigationController на цвета моего приложения. Однако никаких изменений не происходит. Даже когда я пытаюсь это скрыть или хотя бы изменить цвет оттенка строки состояния, ничего не происходит. Зачем?
- (ABPeoplePickerNavigationController *)peoplePicker
{
if(!_peoplePicker){
_peoplePicker = [[ABPeoplePickerNavigationController alloc]init];
_peoplePicker.peoplePickerDelegate = self;
_peoplePicker.navigationBar.hidden = YES;
}
return _peoplePicker;
}
Я ленивый экземпляр моего контроллера навигации и другие вызовы методов, такие как dismiss view controller и т. Д. Работают нормально.
РЕДАКТИРОВАТЬ: Это мой текущий код (для награды). Никаких изменений цвета не происходит, как это:
- (ABPeoplePickerNavigationController *)peoplePicker
{
if(!_peoplePicker){
_peoplePicker = [[ABPeoplePickerNavigationController alloc]init];
_peoplePicker.peoplePickerDelegate = self;
_peoplePicker.navigationBar.tintColor = [UIColor blackColor];
}
return _peoplePicker;
}
- (IBAction)addressBookButtonClicked:(id)sender {
[self presentViewController:self.peoplePicker animated:YES completion:nil];
}
Разве это не работает больше на iOS8?
4 ответа
На самом деле, благодаря комментарию выше, я понял, что внешний прокси должен работать так:
[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
Просто поместите это в метод viewDidLoad контроллера представления, из которого вы запускаете ABPeoplePickerView. Это также будет работать для MFMailerView. Мой код, который я использую для стиля моих баров:
[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont
fontWithName:@"Helvetica Neue" size:12], NSFontAttributeName,
[UIColor whiteColor], NSForegroundColorAttributeName, nil];
[[UINavigationBar appearance] setTitleTextAttributes:attributes];
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
[[UIBarButtonItem appearanceWhenContainedIn:[ABPeoplePickerNavigationController class], nil] setTintColor:[UIColor whiteColor]];
[[UINavigationBar appearanceWhenContainedIn:[ABPeoplePickerNavigationController class], nil] setTintColor:[UIColor whiteColor]];
[[UINavigationBar appearanceWhenContainedIn:[ABPeoplePickerNavigationController class], nil] setBarTintColor:[UIColor redColor]];
[picker.navigationController.navigationBar setTranslucent:NO];
Я вызываю эти методы перед тем, как представить личность, даже в viewdidload.
Проблема цвета: навигационная панель не может быть загружена в тот момент, когда вы пытаетесь получить к ней доступ. Вы пытались установить свойства цвета после представления ABPeoplePickerNavigationController.
проблема скрытия: Обычно вы скрываете панель навигации, вызывая:
- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated;
на UINavigationController, в вашем случае ABPeoplePickerNavigationController.
Ура, Фабиан
Вы используете переменную экземпляра (iVar) _peoplePicker
который принадлежит, по-видимому, к собственности peoplePicker
, Кроме того, у вас есть метод peoplePicker
который возвращает объект класса ABPeoplePickerNavigationController *
,
В вашем IBAction
addressBookButtonClicked:
вы выполняете инструкцию
[self presentViewController:self.peoplePicker animated:YES completion:nil];
Это означает, что вы называете свой метод peoplePicker
, который проверяет iVar _peoplePicker
и устанавливает его (например, оттенок), если он имеет nil
значение.
Но так как вы используете iVar напрямую, т.е. _peoplePicker
вместо self.peoplePicker
, вы не используете метод установки, а просто присваивание.
Это означает сохранение количества UIColor
объект, который вы создаете в [UIColor blackColor]
с сохранением 1 не будет увеличено инструкцией _peoplePicker.navigationBar.tintColor = [UIColor blackColor];
но будет помещен в пул автоматического выпуска, когда он будет возвращен return _peoplePicker;
, Но автозапуск будет очищен, когда ваше приложение вернется к главному циклу событий, а UIColor
объект будет освобожден.
Поэтому я предлагаю вам заменить все назначения _peoplePicker
по назначению self.peoplePicker
, Затем вы используете метод установки, который увеличит количество сохраняемых данных, и ваш UIColor
объект выживет.