2014-09-25 1 views
4

Я пытаюсь изменить цвет навигационной панели ABPeoplePickerNavigationController на цвета моего приложения. Однако никаких изменений не происходит. Даже когда я пытаюсь скрыть это или, по крайней мере, изменить цвет оттенка состояния, ничего не происходит. Зачем?iOS 8: Невозможно изменить панель навигации на всех ABPeoplePickerNavigationController

- (ABPeoplePickerNavigationController *)peoplePicker 
{ 
    if(!_peoplePicker){ 
     _peoplePicker = [[ABPeoplePickerNavigationController alloc]init]; 
     _peoplePicker.peoplePickerDelegate = self; 
     _peoplePicker.navigationBar.hidden = YES; 
    } 
    return _peoplePicker; 
} 

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

EDIT: Это мой текущий код (за щедрость). Изменения цвета не происходят следующим образом:

- (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?

+0

Где моя попытка изменить цвет? – rmaddy

+0

Просто показал пример со скрытым свойством, что ничего не работает, даже не скрыто. Или navigationBar.tint ни .. – MichiZH

+0

В моем собственном приложении просто настройка цвета навигация в приложении через стандартный внешний прокси приводит к появлению навигационной панели 'ABPeoplePickerNavigationController', появляющейся в тех же цветах приложений. Ничего особенного не требовалось. – rmaddy

ответ

7

На самом деле, благодаря комментарий выше, я понял, что внешний вид прокси должен работать так:

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]]; 

Просто положить, что в методе viewDidLoad в View Controller, от которого вы подстрекательстве к 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]; 
+0

Thx alot, это сработало! – MichiZH

+0

Работает для меня! Благодарю. – mrvincenzo

1

проблема цвета: навигационная панель не может быть загружена в момент, когда вы пытаетесь получить к ней доступ. Вы пытались установить свойства цвета после представления ABPeoplePickerNavigationController.

вопрос шкура: Обычно вы скрыть Панель навигации по телефону:

- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated; 

на UINavigationController, в вашем случае ABPeoplePickerNavigationController.

Cheers, Fabian

1

Вы используете переменную экземпляра (Ивар) _peoplePicker, который принадлежит, по-видимому свойству peoplePicker. Кроме того, у вас есть метод peoplePicker, который возвращает объект класса ABPeoplePickerNavigationController *.
В вашем IBActionaddressBookButtonClicked: выполнение команды

[self presentViewController:self.peoplePicker animated:YES completion:nil]; 

Это означает, что вы называете метод peoplePicker, который проверяет Ивар _peoplePicker и устанавливает его (например, оттенок цвета), если это имеет значение nil.
Но так как вы используете iVar напрямую, то есть _peoplePicker вместо self.peoplePicker, вы не используете метод setter, а просто присваиваете.
Это означает, что сумма удержания объекта UIColor, которую вы создаете в [UIColor blackColor] с остатком на 1, не будет увеличена инструкцией _peoplePicker.navigationBar.tintColor = [UIColor blackColor];, но будет помещена в пул авторефератов, когда она будет возвращена return _peoplePicker;. Но autoreleasepool будет истощен, когда приложение вернется в основной цикл событий, и объект UIColor будет выпущен.
Поэтому я предлагаю вам заменить все присвоения на _peoplePicker присвоениями self.peoplePicker. Затем вы используете метод setter, который увеличит количество удержаний, и ваш объект UIColor сохранится.

+0

Я пробовал это, но не работал. По-моему, не имеет смысла? Потому что мой геттер возвращает iVar, поэтому цвет должен быть приписан, не так ли? – MichiZH

2
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.