2009-10-29 20 views
146

Qual è lo scopo dell'utilizzo di IBAction e IBOutlet nella codifica Objective-C per l'iPhone, fa alcuna differenza se non li uso?IBOutlet e IBAction

+12

Tutte le risposte menzionano lo stesso tipo di idea .. ma nessuno spiega perché Interface Builder sembra funzionare lo stesso se non si include IBAction/IBOutlet nell'origine. C'è un'altra ragione per IBAction e IBOutlet o è __ok lasciarli fuori? – bobobobo

+2

La risposta di Michael Rogers qui sotto aggiunge un po 'di spiegazione sul perché il codice funziona anche quando IBAction viene lasciato fuori. – Krishna

+0

IBActions esistono come parte del meccanismo di interazione obiettivo-azione, puoi leggere come IBAction si adatta a questo qui: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Target-Action/ Target-Action.html # // apple_ref/doc/uid/TP40010810-CH12 Puoi leggere su Outlets qui: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Outlets /Outlets.html#//apple_ref/doc/uid/TP40010810-CH10-SW1 –

risposta

194

IBAction e IBOutlet sono macro definite per indicare variabili e metodi a cui è possibile fare riferimento in Interface Builder.

IBAction decide di void e IBOutlet risolve a nulla, ma che significano per Xcode e Interface Builder che queste variabili e metodi possono essere utilizzati in Interface Builder per collegare elementi dell'interfaccia utente al codice.

Se non si utilizza affatto Interface Builder, non sono necessari nel codice, ma se si intende utilizzarlo, è necessario specificare IBAction per i metodi che verranno utilizzati in IB e IBOutlet per gli oggetti che verranno utilizzati in IB.

+0

@Jasarien "è necessario specificare IBAction per i metodi che verranno utilizzati in IB e IBOutlet per gli oggetti che verranno utilizzati in IB." Qual è la differenza? – cyrilchampier

+3

@nerith La stessa differenza che esiste tra metodi e oggetti. IBActions per i metodi, IBOutlet per gli oggetti. – Jasarien

+0

Giusto per chiarire, poiché il mio post è stato modificato, 'IBOutlet' non risolve in' id'. Considera questo: 'IBOutlet UILabel * nameLabel;' - se 'IBOutlet' ha risolto' id', allora quel codice avrebbe letto 'id UIlabel * namelabel;' che produce un errore del compilatore. Come ho detto in origine, "IBOutlet" non risolve nulla. – Jasarien

30

È necessario utilizzare IBOutlet e IBAction se si utilizza il generatore di interfacce (da cui il prefisso IB) per i componenti della GUI. IBOutlet è necessario per associare le proprietà nella tua applicazione con componenti in IB, e IBAction è usato per consentire che i tuoi metodi siano associati alle azioni in IB.

Ad esempio, si supponga di definire un pulsante e un'etichetta in IB. Per modificare dinamicamente il valore del marchio, premendo il pulsante, verrà definire un'azione e proprietà nella vostra applicazione simile a:

UILabel IBOutlet *myLabel; 
-(IBAction) pushme; 

Poi nel IB si sarebbe connettersi myLabel con l'etichetta e collegare il metodo push me con la pulsante. Hai bisogno di IBAction e IBOutlet affinché queste connessioni esistano in IB.

+13

ma perché funziona __still work__ se non si include l'etichettatura IBOutlet ..? – bobobobo

+7

Poiché queste macro non fanno nulla in fase di compilazione, sono semplicemente così l'app di compilazione dell'interfaccia può trovare quei metodi e i file di builder dell'interfaccia nel codice sorgente in modo da poter trascinare tra il generatore di interfacce e il codice, una connessione viene fatta non lo fa Non importa più. –

+0

IBAction non fa nulla neanche in edit-time, almeno per l'ultimo decennio. Puoi anche collegare un metodo '(void)' in Interface Builder. –

3

IBAction e IBOutlet vengono utilizzati per collegare l'interfaccia creata in Interface Builder con il controller. Se non si utilizzi Interface Builder e non si crei un'interfaccia completamente in codice, è possibile creare un programma senza usarlo. Ma in realtà la maggior parte di noi utilizza Interface Builder, una volta che si desidera ottenere un'interattività all'interno dell'interfaccia, sarà necessario utilizzare IBActions e IBoutlet.

5

Interface Builder li utilizza per determinare quali membri e messaggi possono essere "cablati" fino ai controlli dell'interfaccia che si stanno utilizzando nella finestra/vista.

IBOutlet e IBAction sono puramente lì come indicatori che Interface Builder cerca quando analizza il codice in fase di progettazione, non hanno alcun effetto sul codice generato dal compilatore.

38

Il metodo tradizionale di contrassegnare un metodo in modo che venga visualizzato in Interface Builder e di trascinarne una connessione è stato quello di rendere il metodo restituito tipo IBAction. Tuttavia, se rendi invalido il tuo metodo, invece (IBAction è # define'd per essere nullo) e fornisci un argomento (id), il metodo è ancora visibile. Ciò fornisce flessibilità, al

Tutti e 3 di questi sono visibili da Interface Builder:

-(void) someMethod1:(id) sender; 
-(IBAction) someMethod2; 
-(IBAction) someMethod3:(id) sender; 

, consultare la Guida per l'utente Interface Builder di Apple per i dettagli, in particolare la sezione intitolata Xcode Integrazione.

+1

Ecco un link alla guida sopra suggerita: https://developer.apple.com/library/ios/recipes/xcode_help-interface_builder/_index.html – Aggressor

3

Un punto vendita è un collegamento dal codice all'interfaccia utente. Se vuoi mostrare o nascondere un elemento dell'interfaccia utente, se vuoi ottenere il testo di un campo di testo o abilitare o disabilitare un elemento (o un centinaio di altre cose) devi definire un punto vendita di quell'oggetto nelle fonti e collegarlo a quell'outlet attraverso "l'oggetto dell'interfaccia" all'elemento dell'interfaccia utente. Dopodiché puoi usare la presa proprio come qualsiasi altra variabile nella tua codifica.

IBAction - un metodo speciale attivato dagli oggetti dell'interfaccia utente. Interface Builder li riconosce.

@interface Controller 
{ 
    IBOutlet id textField; // links to TextField UI object 
} 

- (IBAction)doAction:(id)sender; // e.g. called when button pushed 

Per ulteriori informazioni consultare Apple Docs

+0

Uhm, no, non è quello che è un IBOutlet. Dove hai preso quell'idea? –

+0

Ho modificato la mia risposta –

1

quando si utilizza Interface Builder, è possibile utilizzare le connessioni ispettore per impostare gli eventi con gestori di eventi, i gestori di eventi dovrebbero essere le funzioni che hanno l'IBAction modificatore. Una vista può essere collegata con il riferimento per lo stesso tipo e con il modificatore IBOutlet.

2

Entrato nel diagramma mentre si osservava la codifica del valore-chiave, si pensava che potesse aiutare qualcuno. Aiuta a capire cosa sia IBOutlet.

Osservando il flusso, è possibile vedere che gli IBOutlet sono lì solo per abbinare il nome della proprietà con un nome di controllo nel file Nib.

How nib file is loaded, screenshot of Matt's online book for iOS6

+0

Questa risposta spiega _why_ e _how_ IBOutlet funzionano, non solo _quello che fanno_. –

Problemi correlati