2009-05-25 16 views
6

Qual è il modo migliore per registrare eventi per la mia sottoclasse UIView, in modo che possa collegarli a IBAction-s nel generatore di interfacce?Eventi personalizzati per UIView

Attualmente ho appena ricevuto un UIView standard sulla mia vista principale e ho impostato la classe su "RadioDial" (la mia classe personalizzata). Questo visualizza bene la vista, ma non ho idea di come ottenere eventi da esso.

Grazie

risposta

5

Si prega di chiarire: intendi che vorresti che Interface Builder offra ai tuoi controller di visualizzazione il collegamento di eventi personalizzati che la sottoclasse di visualizzazione emetterà (proprio come i controlli Button ti consentono di cablare Touch Inside, ecc.)?

Se è necessario questo tipo di funzionalità, sarà necessario utilizzare una proprietà 'delegato' generalizzata sulla vista combinata con un protocollo.

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

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

Questo permetterà al controllore di filo fino alla visualizzazione (supponendo che implementa RadioDialDelegate) e ricevere tutti gli eventi che escono dalla vista. In alternativa, è possibile utilizzare un delegato non tipizzato e nel codice Visualizza, utilizzare una chiamata in ritardo:

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

Sì, è esattamente ciò che intendo. E il problema che sto avendo sta creando quegli eventi personalizzati per la mia sottoclasse vista. Quello che sta accadendo in realtà è che nelle classi - (void) toccaMoved a certe condizioni mi piacerebbe licenziare ed evento e mi piacerebbe che quell'evento fosse collegabile a IBActions tramite IB. –

+0

Ho modificato la mia risposta per riflettere su come farlo. È necessario utilizzare il modello delegato/protocollo per farlo. IB esporrà il delegato come una proprietà assegnata al controller (sarà inoltre necessario impostare correttamente la classe controller in IB) e il controller dovrà implementare il protocollo. – Jason

+0

Questo tipo di ha senso (piuttosto nuovo per l'intera cosa Objective-C/Cocoa), ma come mi permetterebbe di cablare ogni evento di modifica del valore di RadioDial in un metodo diverso sul controller della vista? Capisco che potrei usare lo stesso metodo e controllare il riferimento del mittente, ma è l'unico modo? –

3

Creare un metodo nella controller della vista (se non altro, si dovrebbe avere un RootViewController in voi progetto). Diciamo che il metodo è

-(void) buttonClicked { code code code } 

Nel file di intestazione del controller (ad esempio RootViewController.h) È possibile quindi mettere:

-(IBAction) buttonClicked; 

E in IB si fa clic vostra manopola tasto/radio/qualunque cosa. Verrà visualizzato un elenco di eventi e sarà possibile trascinare DAL connettore dell'evento che si desidera venga ricevuto dal controller, nell'oggetto in IB che rappresenta il controllore (probabilmente First Responder). Questo dipende da come viene configurata la tua struttura IB, ma dovrebbe essere semplice.

Un'altra alternativa è imparare a creare UIViews in modo programmatico e dimenticare IB per il momento. Le opinioni divergono sull'opportunità di imparare a utilizzare IB all'inizio, o se è meglio imparare come fare tutto nel codice e salvare IB per dopo. In ogni caso, è necessario imparare entrambi i modi di configurare un'interfaccia ad un certo punto.

Problemi correlati