ABPeoplePickerNavigationController - rimuovi & # 8220; Annulla & # 8221; pulsante senza usare metodi / proprietà private?

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

Domanda

Sto usando ABPeoplePickerNavigationController, una sottoclasse di UINavigationController, e nel contesto lo sto usando il pulsante della barra di navigazione predefinito per il lato destro, " Annulla " ;, non ha senso. Non riesco a trovare un modo per disabilitarlo o nasconderlo e qualsiasi metodo utilizzato deve essere pubblico e approvato dal negozio. Eliminare completamente la barra di navigazione (picker.navigationBarHidden = YES;) potrebbe essere un'opzione, tranne che dopo essere tornato all'elenco dei contatti, la barra di navigazione ricompare. Sottoclasse ABPeoplePickerNavigationController e intercettazione viewWillAppear per provare a zero il pulsante Annulla non ha funzionato. [picker setAllowsCancel: NO]; FUNZIONA ma non è documentato, quindi mi aspetto che non approvi mai.

È stato utile?

Soluzione 3

Non c'è risposta a questo: scrivi un nuovo selettore di persona se non riesci a convivere con l'annullamento.

Altri suggerimenti

questo

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

funziona perfettamente!

Gli esempi nel presente documento che utilizzano il metodo delegato navigationController: willShowViewController: animato: funzionano, ma è possibile che tu voglia aggiungere il tuo elemento di navigazione nei tuoi controller e le opzioni fornite rimuoveranno tutto ciò che potresti impostare i tuoi controller. Ecco il codice che ho usato con successo per far funzionare bene questa opzione:

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

Si noti che ci sono due controller di visualizzazione nello stack del controller di navigazione, uno per i gruppi di contatti e uno per l'elenco dei contatti. Questo è il motivo per cui non possiamo semplicemente controllare se viewController è il controller della vista superiore del controller di navigazione.

È possibile ottenere quel risultato sfogliando le visualizzazioni secondarie del selettore. Solo un po 'noioso ...

Non l'ho ancora provato, ma penso che Uby stia dicendo di scorrere le visualizzazioni secondarie del selettore fino a quando non ne trovi uno che è isKindOfClass: [classe UIBarButtonItem] e quindi puoi cambiarne la proprietà title. Potrebbe anche trovarsi nell'array "Item" di navigationBar.

Imposta il delegato sul controller PeoplePickerController. Nella classe delegata, utilizza questo metodo delegato.

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

Assicurati di impostare il delegato per l'oggetto picker (non peoplePickerDelegate, solo il delegato) sulla classe che implementa il seguente metodo:

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

Funziona bene ma in iOS 4 c'è un'altra cosa. Quando torno alla mia app utilizzando la funzione Cambio rapido app, viene nuovamente visualizzato il pulsante Annulla.

Il metodo

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

non viene chiamato. Quindi ho fatto questo:

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

Funziona abbastanza bene.

secondo russell b potresti semplicemente sovrascrivere il tuo viewdidapp<

questo ha funzionato per me:

- (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: vedi i commenti qui sotto. Questo è ora un esempio di cosa non fare.

Ho cercato di ottenere il comportamento desiderato con l'API pubblica eseguendo la sottoclasse di ABPeoplePickerNavigationController e intercettando tutti gli eventi che modificano la vista del controller della vista di navigazione corrente. Quindi si può semplicemente navigare nella gerarchia di visualizzazione ed eliminare tutti i pulsanti indesiderati.

Puoi navigare nella gerarchia della vista da un delegato, ma non sei a conoscenza degli eventi che cambiano lo stato della vista ... il che rende difficile uccidere il pulsante Annulla e bloccarlo.

Questo codice tipo di ha funzionato per me (NOTA: la forza bruta uccide tutti i pulsanti della mano destra):

- (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];
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top