2011-03-27 15 views
10

he un método llamado -showMoreTools: que es: UIActionSheet del iPad mostrando varias veces

- (IBAction) showMoreTools:(id)sender { 
    UIActionSheet *popupQuery = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:@"Close" otherButtonTitles:@"Add Bookmark", @"Add to Home Screen", @"Print", @"Share", nil]; 
    popupQuery.actionSheetStyle = UIActionSheetStyleDefault; 
    popupQuery.dismiss 
    [popupQuery showFromBarButtonItem:moreTools animated:YES]; 
    [popupQuery release]; 
} 
Cuando un usuario pulsa un UIBarButtonItem muestra que UIActionSheet, pero entonces, si el usuario quiere cerrar la UIActionSheet sin grabar en el botón Cerrar, (grabar el UIBarButtonItem, a continuación, se muestra el UIActionSheet sobre la primera UIActionSheet

es posible implementar alguna forma de grabar otra vez el UIBarButtonItem para cerrar la UIActionSheet

Muchas gracias -.? soy un novato en iOS Programación !

Respuesta

33

Para descartarlo cuando se hace clic en el botón dos veces, es necesario hacer un seguimiento de la actualidad mostrando ActionSheet. Hacemos esto en nuestra aplicación para iPad y funciona muy bien.

en su clase que tiene los showMoreTools, en el puesto de cabecera:

@interface YourClassHere : NSObject <UIActionSheetDelegate> { 
     UIActionSheet* actionSheet_; // add this line 
} 

En el archivo de clase, cambie a:

-(IBAction) showMoreTools:(id)sender { 
    // currently displaying actionsheet? 
    if (actionSheet_) { 
     [actionSheet_ dismissWithClickedButtonIndex:-1 animated:YES]; 
     actionSheet_ = nil; 
     return; 
    } 

    actionSheet_ = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:@"Close" otherButtonTitles:@"Add Bookmark", @"Add to Home Screen", @"Print", @"Share", nil]; 
    actionSheet_.actionSheetStyle = UIActionSheetStyleDefault; 
    [popupQuery showFromBarButtonItem:moreTools animated:YES]; 
    [actionSheet_ release]; // yes, release it. we don't retain it and don't need to 
} 


- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex { 
    // just set to nil 
    actionSheet_ = nil; 
} 
+0

La solución funcionó bien para mí cuando tuve el mismo problema, gracias. Me pregunto por qué Apple no menciona esto, porque lo hacen explícitamente cuando "agrega la barra de herramientas que posee el botón a la lista de vistas de paso del popover" – Bryan

+0

También creo que habría establecido actionSheet_ en cero en actionSheet clickedButtonAtIndex: – Bryan

+0

No es necesario. Si selecciona un botón, se llama al clickedButtonAtIndex, y luego también se llama al didDismissWithButtonIndex. Poner el = nil solo se requiere en ese único método. Lo compré doblemente en el depurador. – christophercotton

0

uso

- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated 
+0

he intentado pero sigue mostrando una sobre la otra. – Francesc

0

intento por establecer el indicador (SI/NO)

-(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated 
+0

significa que si la hoja de acciones está visible establezca Sí. Al hacer clic en otro botón, verifique que la hoja de cálculo esté visible no está bien ... –

1

he encontrado otra solución a esto. El problema es que al usar showFromBarButtonItem, la vista de la barra de herramientas se agrega automáticamente a la lista de vistas de paso de popover. Puede modificar (y borrar) las vistas de paso cuando usa un UIPopoverController directamente, pero no cuando se presenta como parte de un UIActionSheet.

De todos modos, al usar showFromRect, no hay barra de herramientas que el popover pueda agregar automáticamente a sus vistas de paso. Así que si se conoce el rectángulo (aproximado) en su barra de botones es, se puede usar algo como:

CGRect buttonRect = CGRectIntersection(toolbar.frame, CGRectMake(0, 0, 60, self.frame.size.height)); 
[popupQuery showFromRect:buttonRect inView:self animated:YES]; 

En el ejemplo anterior, el botón de mi está en el lado izquierdo de la barra de herramientas.

+1

Un problema con este enfoque es que si admite la rotación, usted es responsable de gestionar la posición del popover después de la rotación. –

0

Mi método es similar al de christophercotton.

En mi showActionSheet puedo comprobar si la actionsheet es visible en lugar de una instancia:

- (IBAction)showActionSheet:(id)sender 
{ 
    if ([self.fullActionSheet isVisible]) { 
     [self.fullActionSheet dismissWithClickedButtonIndex:-1 animated:NO]; 
     _fullActionSheet = nil; 
     return; 
    } 

    //actionsheet code 
}