2012-01-16 8 views
12

En un método método de clase declaro lo siguiente:¿Puedo usar un método de clase como una devolución de llamada delegado

UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Hello" 
                message:@"World" 
                delegate:self 
             cancelButtonTitle:@"Cancel" 
             otherButtonTitles:@"Done", nil]; 

Ahora a pesar de que el método que contiene es un método de clase, el compilador no se queja acerca de la delegate:self. Ahora para ser el delegado, tengo que implementar el método en el protocolo UIAlertViewDelegate.

¿Importa ahora, si el método es un método de clase o no, para ser llamado cuando el usuario interactúa con mi AlertView?

Estoy haciendo esta pregunta, porque mi clase no tiene variables de instancia, por lo que preferiría que solo contenga métodos de clase.

+1

¿Quiere decir método de clase? : P –

+0

Puede probar el nombre de clase en lugar de self, que se refiere a la instancia. –

+0

También vea la respuesta a http://stackoverflow.com/questions/1781046/dynamically-invoke-a-clase-método-en-objetivo-c. Es importante, creo. –

Respuesta

11

Primero, supongo que por métodos "estáticos", te refieres a los métodos de clase (declarados con + en lugar de -).

"El compilador no se queja" acerca de Objective-C no siempre dice mucho. Todo lo que realmente significa es que ha convencido al compilador de que todo debería (o al menos podría) funcionar en tiempo de ejecución.

Al final, si el objeto que proporciona como delegado responde a los mensajes correctos, al compilador no le importará que sea una clase (y tampoco el tiempo de ejecución). En este caso, está proporcionando self de un método de clase. Es como si escribieras [MyClass class].

Creo que probablemente sea cuestionable si esto es lo que debería hacer, pero eso probablemente esté fuera de los límites de su pregunta.

14

me gustaría compartir algunas de mis conclusiones:

  1. No importa si declaro el delegado como esto delegate:self o delegate:[MyClass class]

  2. Sin embargo, sí importa cómo declarar el método :

    Esto funciona

    +(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
        // Some Actions here 
    } 
    

    Aunque la siguiente "sintaxis" es la declaración en el protocolo UIAlertViewDelegate, que no funciona:

    -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
        // Some Actions here 
    } 
    
+1

Sí, 'self' y' [Clase MyClass] 'son equivalentes dentro de un método" MyClass ". Si desea que su clase sea el delegado, debe declararlo como un método de clase. La documentación describe cómo implementar el método de instancia, que creo que es prácticamente "cómo se hace". Al final, lo que realmente importa es que cualquier objeto que proporciones mientras el delegado responde al selector "alertView: clickedButtonAtIndex:". Entonces, sí, la respuesta es que usted * puede * hacerlo. Si deberías es diferente. – huskerchad

+0

¡Guau! No en un millón de años habría adivinado que convertir el método delegado en un método de clase sería el camino a seguir. ¡Gracias Gracias! Perdí más de 5 horas tratando de resolver un problema similar. ... no necesitaba NSCondition o performSelector ni nada! – JohnQ

+0

muchas gracias !!!!!!!!!!! – ElizaS

1

Sí se puede !!! Una clase es también un objeto.

Cuestiones relacionadas