2012-02-29 14 views
14

He creado una UIActionSheetCómo se disparó el evento Click uibarbuttonitem programación

UIActionSheet * action = [[UIActionSheet alloc]initWithTitle:@"" 
                   delegate:self 
                cancelButtonTitle: @"cancel" 
               destructiveButtonTitle: @"OK" 
                otherButtonTitles: nil]; 
      [action showInView:self.view]; 
      [action release]; 

En el caso de que el botón de cancelación en el UIActionSheet Quiero disparar el caso de UIBarButtonItem, que es en mi opinión.

Mi pregunta es ¿cómo puedo disparar el evento de botón (sin tocar el botón) en el método UIActionSheet delegado

+0

qué método está llamando cuando el usuario toca UIBarButtonItem? – Rupesh

+0

Estoy en una situación complicada. Tengo un 'UIButton' sobre este' UIBarButtonItem'. Con el clic de 'UIButton', cargo una' UIActionSheet'. Y al hacer clic en el botón cancelar en 'UIActionSheet', necesito disparar el evento de' UIBarButtonItem'. –

+0

Paul no pude entender por qué haces 'UIBarButtonItem' si tu' UIBarButtonItem' está bajo 'UIButton'? – hchouhan02

Respuesta

14

Al no conocer la acción del elemento botón de la barra actual puede invocar esta manera:

[barButtonItem.target performSelector:barButtonItem.action] 

Sin embargo, esto traerá una advertencia de compilador de "selector desconocido", pero puede ser worked around.

+0

'UIBarButtonItem' puede no responder a' sendActionsForControlEvents' –

+0

correcto, mi malo, eso es para 'UIButton' – ayoy

+0

editado para' UIBarButtonItem' – ayoy

0

Pues esta es la forma en que uso actionSheet ..

actionSheet = [[UIActionSheet alloc] initWithTitle:nil 
                  delegate:nil 
                cancelButtonTitle:nil 
               destructiveButtonTitle:nil 
                otherButtonTitles:nil]; 

[actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent]; 

CGRect pickerFrame = CGRectMake(0, 40, 0, 0); 

UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:pickerFrame]; 
pickerView.showsSelectionIndicator = YES; 
pickerView.dataSource = self; 
pickerView.delegate = self; 

[actionSheet addSubview:pickerView]; 
[pickerView release]; 

UISegmentedControl *closeButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"Done"]]; 
closeButton.momentary = YES; 
closeButton.frame = CGRectMake(260, 7.0f, 50.0f, 30.0f); 
closeButton.segmentedControlStyle = UISegmentedControlStyleBar; 
closeButton.tintColor = [UIColor blackColor]; 
[closeButton addTarget:self action:@selector(dismissActionSheet) forControlEvents:UIControlEventValueChanged]; 
[actionSheet addSubview:closeButton]; 
[closeButton release]; 

[actionSheet showInView:[[UIApplication sharedApplication] keyWindow]]; 

[actionSheet setBounds:CGRectMake(0, 0, 320, 485)]; 

Una vez que haya terminado con esto sólo definir un selector en su .m como ..

-(void)dismissActionSheet{ 
    [actionSheet dismissWithClickedButtonIndex:0 animated:YES]; 
} 

tan dentro despedir hoja de acción que puede volver a escribir lo que está sucediendo dentro del elemento del botón de la barra ... espero que esto ayude.

0

implementar el método delegado

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex 

O

- (void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex 
{ 
    if(buttonIndex == actionSheet.destructiveButtonIndex) 
    { 

    } 
    else if(buttonIndex == (actionSheet.cancelButtonIndex)) 
    { 
     // Call your event here 
     // Fire the event of UIBarButtonItem. 
    } 

} 

actionSheet: didDismissWithButtonIndex:

Enviado a la delegado después de una hoja de acción es despedido de la pantalla.

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex Parameters

actionSheet La hoja de acción que fue desestimada. buttonIndex El índice del botón que se hizo clic. Los índices de botón comienzan en 0. Si este es el índice de botón de cancelar, la hoja de acción se está cancelando. Si -1, el índice del botón cancelar no está configurado.

Discusión: Este método se invoca después de que termina la animación y la vista está oculta.

actionSheet: willDismissWithButtonIndex:

enviado al delegado ante una hoja de recurso será rechazado.

- (void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex Parameters

actionSheet La hoja de acción que está a punto de ser despedido. buttonIndex El índice del botón en el que se hizo clic. Si este es el índice del botón cancelar , la hoja de acción se está cancelando. Si -1, el índice de botón cancelar no está establecido.

Discusión Este método se invoca antes de que comience la animación y la vista está oculta.

+0

Esto fue realmente útil para mí. Gracias @Krrish – NSExpression

2

Puede utilizar este método para desencadenar el evento del grifo mediante programación de un botón específico:

[self performSelector:@selector(buttonClicked:) withObject:self.myButton afterDelay:0.0]; 
23

Otra forma de hacer eso y advertencias evitando es el siguiente:

[[UIApplication sharedApplication] sendAction:barButtonItem.action 
              to:barButtonItem.target 
             from:nil 
            forEvent:nil]; 
+0

Gracias por el desde cero, porque la mayoría de las acciones tiene remitente – Mutawe

2

I' he leído la respuesta aceptada y es terriblemente PELIGROSO. ¡nunca debe suprimir tales advertencias para atajar el camino hacia su resultado deseado!

la forma más segura de hacerlo:

SEL selector=barButton.action; 
id target=barButton.target; 
    if(selector && target){ 
    IMP imp = [target methodForSelector:selector]; 
    void (*func)(id, SEL) = (void *)imp; 
    func(target, selector); 
    } 

Por favor, lea el post original aquí: performSelector may cause a leak because its selector is unknown

6

solución ton1n8o 's @ trabajó para mí. Aquí está la implementación en swift:

UIApplication.sharedApplication().sendAction(barButtonItem.action, to: barButtonItem.target, from: nil, forEvent: nil) 
Cuestiones relacionadas