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.
Respuesta
No hay respuesta a esto: escriba un nuevo selector de personas si no puede vivir con la cancelación.
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
Puede lograr ese resultado navegando a través de las subvistas del selector. Solo un poco aburrido ...
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];
}
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.
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];
}
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.
é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!
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.
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];
}
}
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. –
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
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. –
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)];
}
- 1. UIAlertView sin botón Cancelar?
- 2. JDialog cancelar botón
- 3. botón Cancelar en forma
- 4. Botón de aviso de JavaScript Cancelar botón?
- 5. Haciendo clic en el botón cancelar showInputDialogue
- 6. UIAlertView: ¿Dónde debería estar el botón cancelar?
- 7. Cómo manejar el botón cancelar en JOptionPane
- 8. IAP iOS UIAlertView botón cancelar
- 9. Abortar vs. Cancelar Botón: ¿Cuándo uso Abortar, cuando Cancelar?
- 10. deselectRowAtIndexPath en un ABPeoplePickerNavigationController
- 11. UIActionSheet en el iPad no muestra el botón cancelar
- 12. Cancelar AsyncTask cuando el usuario presiona el botón
- 13. Impedir cancelar el modo de acción presionando el botón Atrás
- 14. Mostrar siempre el botón cancelar en un UISearchBar
- 15. Cómo desencadenar la validación sin utilizar un botón de envío
- 16. IOS - Personalización del botón Cancelar UISearchBar
- 17. ¿Debería un botón cancelar solicitar confirmación?
- 18. Agregar un botón cancelar al teclado UITextField
- 19. no quite de funcionar correctamente
- 20. Problemas con el botón de cancelar UIImagePickerController no funciona
- 21. UISearchBar dentro de una UIToolbar no mostrará el botón cancelar
- 22. El delegado de UISearchBar no responde al botón cancelar
- 23. El botón Cancelar de la barra de búsqueda no funciona
- 24. Cancelar el botón de envío predeterminado en ASP.NET
- 25. Cómo utilizar el botón onclick en baseAdapter
- 26. Utilizar el botón externo para rich: archivoUpload
- 27. Python CSV: Quite las comillas del valor
- 28. Javascript Confirmar ventana emergente Sí, sin botón en lugar de Aceptar y cancelar
- 29. ¿Cómo puedo cambiar las cadenas del botón "Cancelar", la etiqueta "Sin resultados" en UISearchBar de UISearchDisplayController?
- 30. Aviso de Javascript() - botón cancelar para finalizar la función
probar este https://gist.github.com/2970980 –
Esto podría ayudar a http://www.scott-sherwood.com/ios5-removing-the-cancel-button-on-abpeoplepickernavigationcontroller/ – c0d3Junk13
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