ABPeoplePickerNavigationController - supprime le bouton «Annuler» sans utiliser de méthodes / propriétés privées?

StackOverflow https://stackoverflow.com/questions/1611499

Question

J'utilise ABPeoplePickerNavigationController, une sous-classe de UINavigationController, et dans ce contexte, le bouton de barre de navigation par défaut pour le côté droit, "Annuler", n'a aucun sens. Je ne peux pas trouver un moyen de le désactiver ou de le cacher, et quelle que soit la méthode utilisée, elle doit être publique et compatible avec les magasins. Se débarrasser entièrement de la barre de navigation (picker.navigationBarHidden = YES;) peut être une option, sauf qu'après être revenu à la liste des contacts, la barre de navigation réapparaît. Sous-classer ABPeoplePickerNavigationController et intercepter viewWillAppear pour essayer de supprimer le bouton d'annulation ne fonctionnait pas. [sélecteur setAllowsCancel: NO]; TRAVAILLE mais ne possède pas de documents, je suppose donc qu’il n’aurait jamais été approuvé.

Était-ce utile?

La solution 3

Il n'y a pas de réponse à cela. Écrivez un nouveau sélecteur de personnes si vous ne pouvez pas vivre avec l'annulation.

Autres conseils

celui-ci

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
  UIView *custom = [[UIView alloc] initWithFrame:CGRectMake(0.0f,0.0f,0.0f,0.0f)]; 
  UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithCustomView:custom]; 
  //UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addAction)]; 
  [viewController.navigationItem setRightBarButtonItem:btn animated:NO]; 
  [btn release]; 
  [custom release]; 
}

fonctionne parfaitement!

Les exemples ci-dessous utilisant la méthode déléguée navigationController: willShowViewController: animated: work, mais il se peut que vous souhaitiez ajouter votre propre élément de navigation dans vos propres contrôleurs et les options données supprimeront tout ce que vous pourriez définir. vos propres contrôleurs. Voici le code que j'ai utilisé avec succès pour que cette option fonctionne correctement:

- (void)navigationController:(UINavigationController *)navigationController
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated {

    // Here we want to remove the 'Cancel' button, but only if we're showing
    // either of the ABPeoplePickerNavigationController's top two controllers
    if ([navigationController.viewControllers indexOfObject:viewController] <= 1) {

        viewController.navigationItem.rightBarButtonItem = nil;
    }
}

Notez qu'il existe deux contrôleurs de vue dans la pile du contrôleur de navigation, l'un pour les groupes de contacts et l'autre pour la liste de contacts. C’est pourquoi nous ne pouvons pas simplement vérifier si le contrôleur de la vue est le contrôleur de la vue supérieure du contrôleur de navigation.

Vous pouvez obtenir ce résultat en naviguant dans les sous-vues du sélecteur. Juste un peu ennuyeux ...

Je ne l'ai pas encore essayé, mais je pense qu'Uby recommande de parcourir les sous-vues du sélecteur jusqu'à ce que vous en trouviez un qui est isKindOfClass: [UIBarButtonItem class], puis vous pouvez modifier sa propriété title. Il se peut également qu'il se trouve dans le tableau 'Item' de la barre de navigation.

Définissez le délégué sur le contrôleur PeoplePickerController. Dans la classe des délégués, utilisez cette méthode de délégué.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
 UIView *pCustomView = [[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)];
 UIBarButtonItem *pBtn = [[UIBarButtonItem alloc] initWithCustomView:pCustomView];
 [viewController.navigationItem setRightBarButtonItem:pBtn animated:NO];
 [pBtn release];
 [pCustomView release];
}

Veillez à définir le délégué pour l'objet sélecteur (et non le peoplePickerDelegate, uniquement le délégué) sur la classe qui implémente la méthode suivante:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
UIView *custom = [[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)];
UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithCustomView:custom];
[viewController.navigationItem setRightBarButtonItem:btn animated:NO];
[btn release];
[custom release];
} 

Cela fonctionne bien, mais sous iOS 4, il y a encore une chose. Lorsque je reviens à mon application à l'aide de la fonction Changement rapide d'application, le bouton d'annulation apparaît à nouveau.

La méthode

- (void)navigationController:(UINavigationController *)navigationController  
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated

ne se fait pas appeler. Alors j'ai fait ceci:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    id topView = pickerControllerDelegate.peoplePicker.topViewController;
    topView.navigationItem.rightBarButtonItem = nil;
}

Cela fonctionne plutôt bien.

selon russell b, vous pouvez simplement écraser votre viewdidappear

.

cela a fonctionné pour moi:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    UINavigationItem *item = (UINavigationItem *)[self.navigationBar.items lastObject];
    item.rightBarButtonItems = [[NSArray alloc] init];

    item.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addPerson)];
}

EDIT: Voir les commentaires ci-dessous. C’est maintenant une illustration de ce qu’il ne faut pas faire.

J'ai essayé d'obtenir le comportement souhaité avec l'API publique en sous-classant ABPeoplePickerNavigationController et en interceptant tous les événements modifiant la vue du contrôleur de la vue de navigation actuelle. Ensuite, il suffit de naviguer dans la hiérarchie des vues et de purger tous les boutons indésirables.

Vous pouvez naviguer dans la hiérarchie des vues depuis un délégué, mais vous n'êtes pas au courant des événements qui modifient l'état de la vue ..., ce qui rend difficile la suppression du bouton Annuler et son maintien.

Ce code type de a fonctionné pour moi (NOTE: il force brutalement à tuer tous les boutons de droite):

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self killCancelButton];
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [super pushViewController:viewController animated:animated];
    [self killCancelButton];
}

- (UIViewController*)popViewControllerAnimated:(BOOL)animated {
    UIViewController *result = [super popViewControllerAnimated:animated];
    [self killCancelButton];
    return result;
}

- (void)killCancelButton {
    for (NSUInteger itemIdx = 0; itemIdx < self.navigationBar.items.count; itemIdx++) {
        UINavigationItem *item = [self.navigationBar.items objectAtIndex:itemIdx];
        item.rightBarButtonItems = [[NSArray alloc] init];
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top