/ / iOS 8: Не мога да променя лентата за навигация на всички ABPeoplePickerNavigationController - ios, abpeoplepickerview

iOS 8: Не можете да промените навигационната лента на всички ABPeoplePickerNavigationController - ios, abpeoplepickerview

Опитвам се да променя цвета наABPeoplePickerNavigationController navbar към цветовете на моето приложение. Въпреки това не настъпват промени. Дори когато се опитам да го скрия или поне да променя цвета на нюанса на лентата на състоянието, нищо не се случва. Защо?

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

Отговори:

7 за отговор № 1

Всъщност, благодарение на коментара по-горе, разбрах, че прокси сървърът трябва да работи така:

[[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];

2 за отговор № 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.


1 за отговор № 3

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

Проблемът за скриване: Обикновено скривате NavigationBar, като се обаждате:

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

на UINavigationController, във вашия случай ABPeoplePickerNavigationController.

Наздраве, Фабиан


1 за отговор № 4

Използвате променлива на инстанция (iVar) _peoplePicker, която очевидно принадлежи на имот peoplePicker, Освен това имате метод peoplePicker който връща обект от клас ABPeoplePickerNavigationController *.
Във вашия IBAction addressBookButtonClicked: изпълнявате инструкцията

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

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