2009-10-23 13 views
5

Sto utilizzando ABPeoplePickerNavigationController, una sottoclasse di UINavigationController e, nel contesto in cui lo sto utilizzando, il pulsante della barra di navigazione predefinito per il lato destro, "Annulla", non ha senso. Non riesco a trovare un modo per disattivarlo o nasconderlo e qualsiasi metodo utilizzato deve essere pubblico e approvabile dal punto vendita. Sbarazzarsi completamente della barra di navigazione (picker.navigationBarHidden = YES;) potrebbe essere un'opzione tranne che dopo essere ritornati all'elenco dei contatti riappare la barra di navigazione. Sottoclassi ABPeoplePickerNavigationController e vista intercettazioneWillAppear per provare a annullare il pulsante Annulla non ha funzionato. [selettore setAllowsCancel: NO]; Funziona ma non è documentato, quindi mi aspetto che non passi mai l'approvazione.ABPeoplePickerNavigationController - rimuove il pulsante "Annulla" senza utilizzare metodi/proprietà privati?

+0

provare questo https://gist.github.com/2970980 –

+0

Questo potrebbe aiutare http://www.scott-sherwood.com/ios5-removing-the-cancel-button-on-abpeoplepickernavigationcontroller/ – c0d3Junk13

+0

Sono bloccato allo stesso problema, e voglio solo dire che è assolutamente ridicolo da parte di Apple . Sì, la tua app verrà rifiutata se utilizzi setAllowsCancel o setAllowsCardEditing. – c0d3Junk13

risposta

0

Non c'è una risposta a questo - scrivi una nuova selezione personale se non puoi vivere con l'annullamento.

+0

Non si può semplicemente scrivere un "selettore persona" - è necessario chiedere l'autorizzazione della rubrica, che farà cadere il tasso di conversione; il selettore di persone predefinito di Apple non richiede un permesso di sistema. – Zorayr

0

È possibile ottenere tale risultato sfogliando le sottoview del selettore. Solo un po 'noioso ...

0

Imposta delegato sul controller PeoplePickerController. Nella classe delegato, disporre di 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]; 
} 
0

non l'ho ancora provato, ma penso Uby sta dicendo per scorrere le subviews del selettore fino a trovare quello che è isKindOfClass: [class UIBarButtonItem] e poi si può cambiare è di proprietà del titolo. Potrebbe anche essere nell'array "Articolo" della barra di navigazione.

0

Assicurarsi di impostare il delegato per oggetto picker (non il peoplePickerDelegate, appena il delegato) per la 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]; 
} 
0

Funziona bene, ma in iOS 4 v'è un'altra cosa . Quando torno alla mia app utilizzando la funzione Cambio rapido app, il pulsante Annulla appare di nuovo.

Il metodo

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

non viene chiamato. Così ho fatto questo:

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

Funziona piuttosto bene.

4

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 perfetto!

2

Gli esempi qui utilizzando il metodo delegate navigationController: willShowViewController: animato: funziona, ma potrebbe essere il caso che si desideri aggiungere il proprio elemento di navigazione nei propri controller e le opzioni fornite rimuoveranno tutto ciò che si potrebbe impostare nei tuoi controllori. Ecco il codice che ho usato con successo per ottenere questa opzione per funzionare bene:

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

Nota che ci sono due controller di vista nello stack del controller di navigazione, quello per gruppi di contatto e uno per la lista dei contatti. Questo è il motivo per cui non possiamo semplicemente controllare che viewController sia il controller di visualizzazione superiore del controller di navigazione.

0

MODIFICA: Vedere i commenti di seguito. Questa è ora un'illustrazione di cosa non fare.

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

È possibile spostarsi tra la gerarchia della vista da un delegato, ma non si è a conoscenza degli eventi che modificano lo stato della visualizzazione ... il che rende difficile annullare il pulsante Annulla e renderlo attivo.

Questo codice tipo di ha lavorato per me (NOTA: forza bruta uccide tutti i pulsanti a 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]; 
    } 
} 
+0

BTW, hai ragione viewWillAppear: (BOOL) non ha funzionato. Ho dovuto attivare killCancelButton dopo che la vista è già attiva. Non sembra glitchy sul mio iPhone 4, ma potrebbe sembrare divertente su dispositivi più vecchi/lenti, suppongo. –

+0

Sembra glitchy perché quando ABPeoplePickerNavigationController appare come modale si anima con il pulsante Annulla. Solo quando si ferma è il pulsante rimosso. Argh. – n13

+0

Ho finito per costruire la mia vista/controller ottenendo i dati del modello dal framework Address Book, perché questo ha finito per essere un errore come notato sopra. Spero di non aver ingannato nessuno in un senso di sicurezza della forza bruta. –

0

secondo Russel B si può solo sovrascrivere il viewdidapper

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)]; 
} 
Problemi correlati