/ / iOS 8: impossible de modifier la barre de navigation sur tous les ABPeoplePickerNavigationController - ios, abpeoplepickerview

iOS 8: impossible de modifier la barre de navigation de tous les ABPeoplePickerNavigationController - ios, abpeoplepickerview

J'essaie de changer la couleur duABPeoplePickerNavigationController navbar aux couleurs de mon application. Cependant, aucun changement ne se produit. Même lorsque j'essaie de le cacher ou au moins de changer la couleur de la teinte de la barre d'état, rien ne se passe. Pourquoi?

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

J'instancie paresseusement mon contrôleur de navigation et les autres appels de méthode comme ignorer le contrôleur de vue, etc. fonctionnent bien.

EDIT: Ceci est mon code actuel (pour la prime). Aucun changement de couleur ne se produit comme ceci:

- (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];
}

Cela ne fonctionne-t-il plus sur iOS8?

Réponses:

7 pour la réponse № 1

En fait, grâce au commentaire ci-dessus, j'ai réalisé qu'un proxy d'apparence devrait fonctionner comme suit:

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

Il suffit de mettre cela dans la méthode viewDidLoad duAfficher le contrôleur à partir duquel vous lancez ABPeoplePickerView. Cela fonctionnera également pour MFMailerView. Mon code que j'utilise pour styliser correctement mes barres est le suivant:

[[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 pour la réponse № 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];

J'appelle ces méthodes avant de présenter le sélecteur de personne même pas dans le viewdidload.


1 pour la réponse № 3

le problème de couleur: La barre de navigation peut ne pas être chargée au moment où vous essayez d'y accéder. Avez-vous essayé de définir les propriétés de couleur après avoir présenté ABPeoplePickerNavigationController.

le problème de masquage: vous masquez normalement la barre de navigation en appelant:

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

sur UINavigationController, dans votre cas ABPeoplePickerNavigationController.

À la vôtre, Fabian


1 pour la réponse № 4

Vous utilisez une variable d'instance (iVar) _peoplePicker, qui appartient apparemment à une propriété peoplePicker. De plus, vous avez une méthode peoplePicker qui renvoie un objet de classe ABPeoplePickerNavigationController *.
Dans ton IBAction addressBookButtonClicked: vous exécutez l'instruction

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

Cela signifie que vous appelez votre méthode peoplePicker, qui vérifie l'iVar _peoplePicker et le définit (par exemple la couleur de la teinte) s'il a un nil valeur.
Mais puisque vous utilisez directement l'iVar, c'est-à-dire _peoplePicker au lieu de self.peoplePicker, vous n'utilisez pas la méthode setter, mais simplement une affectation.
Cela signifie que le nombre de UIColor objet que vous créez dans [UIColor blackColor] avec un compte retenu de 1 ne sera pas augmenté par l'instruction _peoplePicker.navigationBar.tintColor = [UIColor blackColor]; mais sera placé dans un pool de libération automatique lorsqu'il sera retourné par return _peoplePicker;. Mais le pool d'autorelease sera vidé lorsque votre application reviendra à la boucle d'événement principale, et UIColor l'objet sera libéré.
Je vous suggère donc de remplacer toutes les affectations à _peoplePicker par affectations à self.peoplePicker. Ensuite, vous utilisez la méthode setter, qui augmentera le nombre de retenues, et votre UIColor l'objet survivra.