2009-10-23 11 views
5

Estoy usando el ABPeoplePickerNavigationController, una subclase de UINavigationController, y en el contexto en que lo estoy usando, el botón predeterminado de la barra de navegación para el lado derecho, "Cancelar", no tiene sentido. No puedo encontrar la manera de desactivarlo u ocultarlo, y cualquier método utilizado debe ser público y aprobable en la tienda. Deshacerse por completo de la barra de navegación (picker.navigationBarHidden = YES;) podría ser una opción, excepto que después de volver a la lista de contactos, la barra de navegación vuelve a aparecer. Subclassing ABPeoplePickerNavigationController e interceptación viewWillAppear para intentar y nil el botón de cancelación no funcionó. [set selectorAllowsCancel: NO]; HACE el trabajo pero no está documentado, así que espero que nunca pase la aprobación.ABPeoplePickerNavigationController: quite el botón "Cancelar" sin utilizar métodos/propiedades privados.

+0

probar este https://gist.github.com/2970980 –

+0

Esto podría ayudar a http://www.scott-sherwood.com/ios5-removing-the-cancel-button-on-abpeoplepickernavigationcontroller/ – c0d3Junk13

+0

Estoy atrapado en el mismo problema, y ​​solo quiero decir que esto es ridículo absoluto por parte de Apple . Sí, su aplicación será rechazada si usa setAllowsCancel o setAllowsCardEditing. – c0d3Junk13

Respuesta

0

No hay respuesta a esto: escriba un nuevo selector de personas si no puede vivir con la cancelación.

+0

No puede simplemente escribir un "selector de personas": deberá solicitar el permiso de la libreta de direcciones, que reducirá la tasa de conversión; el selector de personas predeterminado de Apple no requiere un permiso del sistema. – Zorayr

0

Puede lograr ese resultado navegando a través de las subvistas del selector. Solo un poco aburrido ...

0

Establezca el delegado en el controlador PeoplePickerController. En la clase de delegado, tenga este método delegado.

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

no he probado todavía, pero creo que Uby está diciendo para recorrer los subvistas del selector hasta que encuentre uno que es isKindOfClass: [clase UIBarButtonItem] y luego se puede cambiar su título de propiedad. También podría estar en la matriz 'Artículo' de la barra de navegación.

0

Asegúrese de ajustar el delegado para el objeto selector (no el peoplePickerDelegate, sólo el delegado) a la clase que implementan el método siguiente:

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

Funciona bien, pero en iOS 4 hay una cosa más . Cuando vuelvo a mi aplicación usando la función Cambio rápido de aplicación, el botón cancelar aparece nuevamente.

El método

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

no se consiga llamar. Así que hice esto:

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

Funciona bastante bien.

4

éste

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

funciona perfecto!

2

Los ejemplos aquí utilizando el método de delegado navigationController: willShowViewController: animado: funcionan, pero puede ser que desee agregar su propio elemento de navegación en sus propios controladores y las opciones dadas eliminarán todo lo que pueda establecer en tus propios controladores. Aquí está el código que he utilizado con éxito para obtener esta opción para trabajar bien:

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

Tenga en cuenta que hay dos controladores de vista en la pila del mando de navegación, el de los grupos de contacto y uno de la lista de contactos. Esta es la razón por la cual no podemos simplemente verificar si el viewController es el controlador de vista superior del controlador de navegación.

0

EDITAR: Ver comentarios a continuación. Esto es ahora una ilustración de lo que no se debe hacer.

Intenté obtener el comportamiento deseado con la API pública mediante la creación de una subclasificación de ABPeoplePickerNavigationController e interceptando todos los eventos que cambian la vista actual del controlador de vista de navegación. Entonces uno puede simplemente navegar por la jerarquía de vista y purgar todos los botones no deseados.

Puede navegar por la jerarquía de vistas desde un delegado, pero no está al tanto de los eventos que cambian el estado de la vista ... lo que hace que sea difícil matar el botón Cancelar y hacer que se adhiera.

Este código tipo de trabajó para mí (NOTA: es la fuerza bruta mata a todos los botones de la derecha):

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

Por cierto, tiene razón viewWillAppear: (BOOL) no funcionó. Tuve que activar killCancelButton después de que la vista ya estaba en vivo. No se ve mal en mi iPhone 4, pero podría parecer divertido en dispositivos más antiguos/lentos, supongo. –

+0

Parece un error porque cuando ABPeoplePickerNavigationController aparece como modal, se anima con el botón Cancelar. Solo cuando se detiene, se quita el botón. Argh. – n13

+0

Terminé construyendo mi propia vista/controlador obteniendo datos del modelo desde el marco de la libreta de direcciones, porque esto terminó siendo un error como se señaló anteriormente. Espero no haber confundido a nadie con un sentido de seguridad de fuerza bruta. –

0

según Russel b sólo podría sobrescribir su viewdidapper

esto funcionó para mí:

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