2009-05-25 13 views
6

¿Cuál es la mejor forma de registrar eventos para mi subclase UIView, de modo que pueda conectarlos a IBAction-s en el constructor de interfaces?Eventos para UIView personalizado

Actualmente tengo un UIView estándar colocado en mi vista principal y he configurado la clase en "RadioDial" (mi clase personalizada). Esto muestra la vista bien, pero no tengo idea de cómo sacar eventos de ella.

Gracias

Respuesta

5

Aclare: ¿quiere decir que le gustaría que Interface Builder le ofrezca a sus controladores de vista que conecten los eventos personalizados que su subclase de vista emitirá (al igual que los controles Button le permiten conectar Touch Inside, etc.)?

Si necesita este tipo de funcionalidad, necesitará usar una propiedad de 'delegado' generalizada en su vista combinada con un protocolo.

@protocol RadioDialDelegate 
-(void)dialValueChanged:(id)sender 
@end 

@interface RadioDial 
{ 
    id<RadioDialDelegate> radioDelegate; 
} 
@property (nonatomic, assign) IBOutlet id<RadioDialDelegate> radioDelegate; 

Esto permitirá que el controlador de cable hasta el punto de vista (suponiendo que implementa RadioDialDelegate) y recibir eventos que salen de la vista. Alternativamente, puede usar un delegado sin tipo y en su código de vista, use una llamada encuadernada tarde:

if([radioDelegate respondsToSelector:@selector(dialValueChanged:)]) { 
    [radioDelegate dialValueChanged:self]; 
} 
+0

Sí, eso es exactamente lo que quiero decir. Y el problema que tengo es crear esos eventos personalizados para mi subclase de vista. Lo que está sucediendo realmente es que en las clases - (nulo) toca Me gusta en ciertas condiciones me gustaría disparar y evento y me gustaría que ese evento sea conectable a IBActions a través de IB. –

+0

He editado mi respuesta para reflejar cómo hacerlo. Tendrá que utilizar el patrón delegado/protocolo para hacer eso. IB expondrá al delegado como una propiedad asignada a su controlador (también necesitará configurar su clase de controlador en IB), y su controlador deberá implementar el protocolo. – Jason

+0

Ese tipo de sentido tiene sentido (bastante nuevo para todo el asunto Objective-C/Cocoa), pero ¿cómo podría permitirme cablear cada evento de cambio de valor de RadioDial a un método diferente en el controlador de visualización? Entiendo que podría usar el mismo método y consultar la referencia del remitente, pero ¿es esa la única manera? –

3

Crear un método en el controlador de vista (si no otra cosa, usted debe tener un RootViewController en que proyecto). Digamos que su método es

-(void) buttonClicked { code code code } 

En el archivo de cabecera del controlador (por ejemplo RootViewController.h) Luego, se coloca:

-(IBAction) buttonClicked; 

Y en IB se haga clic en su dial/botón de radio/lo que sea. Verá una lista de eventos y puede arrastrar desde el conector del evento que desea que reciba su controlador al objeto en IB que representa el controlador (probablemente Primer Respondedor). Esto depende de cómo esté configurada su estructura IB, pero debería ser sencillo.

Otra alternativa es aprender cómo crear UIViews programáticamente y olvidarse de IB por el momento. Las opiniones están divididas acerca de si es mejor aprender a utilizar IB desde el principio, o si es mejor aprender a hacer todo en el código y guardar IB para más adelante. En cualquier caso, es necesario aprender las dos formas de configurar una interfaz en algún momento.

Cuestiones relacionadas