ABPeoplePickerNavigationController - eliminar & # 8220; Cancel & # 8221; ¿Botón sin usar métodos / propiedades privadas?

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

Pregunta

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

¿Fue útil?

Solución 3

No hay respuesta para esto: escribe un nuevo selector de personas si no puedes vivir con la cancelación.

Otros consejos

este

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

Los ejemplos en este documento utilizan el método delegado navigationController: willShowViewController: animated: do work, pero es posible que desee agregar su propio elemento de navegación en sus propios controladores y las opciones dadas eliminarán todo lo que pueda configurar. tus propios controladores Este es el código que he usado con éxito para que esta opción funcione 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 controlador de navegación, uno para grupos de contactos y otro para la lista de contactos. Esta es la razón por la que no podemos comprobar si el controlador de la vista es el controlador de vista superior del controlador de navegación.

Puede lograr ese resultado explorando las subvistas del selector. Solo un poco aburrido ...

No lo he probado todavía, pero creo que Uby está diciendo que repitas las subvistas del selector hasta que encuentres una que sea isKindOfClass: [clase UIBarButtonItem] y luego puedas cambiar su propiedad de título. También podría estar en la matriz 'Elemento' de la barra de navegación.

Establezca delegado en el controlador PeoplePickerController. En la clase delegada, tenga este método de 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];
}

Asegúrese de establecer el delegado para el objeto selector (no el peoplePickerDelegate, solo el delegado) a la clase que implementa el siguiente método:

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

Funciona bien, pero en iOS 4 hay una cosa más. Cuando vuelvo a mi aplicación con 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 llama. Así que hice esto:

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

Funciona bastante bien.

de acuerdo con russell b, puedes sobrescribir tu viewdidappear

esto me funcionó:

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

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

Intenté obtener el comportamiento deseado con la API pública subclasificando ABPeoplePickerNavigationController e interceptando todos los eventos que cambian la vista actual del controlador de la vista de navegación. Luego, solo puede navegar por la jerarquía de vistas y purgar todos los botones no deseados.

Puedes navegar por la jerarquía de vistas desde un delegado, pero no estás al tanto de los eventos que cambian el estado de la vista ... lo que dificulta matar el botón Cancelar y mantenerlo.

Este código tipo funcionó para mí (NOTA: la fuerza bruta mata todos los botones de la mano 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];
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top