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 *,
В вашем IBActionaddressBookButtonClicked: вы выполняете инструкцию

[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 объект выживет.

Другие вопросы по тегам