IBOutlet e IBAction


159

Qual è lo scopo dell'utilizzo di IBOutlet e IBActions in Xcode e Interface Builder?

Fa differenza se non utilizzo IBOutlets e IBActions?


Swift:

@IBOutlet weak var textField: UITextField!

@IBAction func buttonPressed(_ sender: Any) { /* ... */ }

Objective-C:

@property (nonatomic, weak) IBOutlet UITextField *textField;

- (IBAction)buttonPressed:(id)sender { /* ... */ }

12
Tutte le risposte menzionano lo stesso tipo di idea .. ma nessuno spiega perché Interface Builder sembra funzionare allo stesso modo se NON includi IBAction / IBOutlet nella tua fonte. C'è un altro motivo per IBAction e IBOutlet o va bene lasciarli fuori ?
Bobobobo,

2
La risposta di Michael Rogers di seguito aggiunge un po 'di spiegazione sul perché il codice funziona anche quando IBAction viene escluso.
Krishna,

IBActions esiste come parte del meccanismo di interazione target-action, puoi leggere come IBAction si adatta a questo qui: developer.apple.com/library/ios/documentation/General/… Puoi leggere su Outlets qui: developer.apple. com / libreria / ios / documentazione / Generale / ...
William Power

Risposte:


208

IBActione IBOutletsono macro definite per indicare variabili e metodi a cui è possibile fare riferimento in Interface Builder.

IBActionnon si risolve voide non IBOutletrisolve nulla, ma indicano al builder Xcode e Interface che queste variabili e metodi possono essere utilizzati nel builder Interface per collegare gli elementi dell'interfaccia utente al codice.

Se non utilizzerai affatto Interface Builder, non ti IBActionserviranno nel tuo codice, ma se lo utilizzerai, dovrai specificare i metodi che verranno utilizzati in IB e gli IBOutletoggetti che verrà utilizzato in IB.


@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 esistente tra metodi e oggetti. IBAzioni per metodi, IBOutlet per oggetti.
Jasarien,

Solo per chiarire, dal momento che il mio post è stato modificato, IBOutletnon si risolve id. Considera questo: IBOutlet UILabel *nameLabel;- se IBOutletrisolto id, allora quel codice leggerebbe id UIlabel *namelabel;che produce un errore del compilatore. Come ho affermato inizialmente, non si IBOutletrisolve in niente.
Jasarien,

38

Il modo tradizionale di contrassegnare un metodo in modo che appaia in Interface Builder e che è possibile trascinare una connessione su di esso è stato quello di rendere il metodo di ritorno tipo IBAction. Tuttavia, se si annulla il metodo (IBAction è # definito per essere nullo) e si fornisce un argomento (id), il metodo è ancora visibile. Ciò fornisce ulteriore flessibilità, al

Tutti e 3 questi sono visibili da Interface Builder:

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

Consulta la Guida dell'utente di Interface Builder per i dettagli, in particolare la sezione intitolata Integrazione Xcode.


1
Ecco un link alla guida sopra suggerita: developer.apple.com/library/ios/recipes/…
Aggressor

32

È necessario utilizzare IBOutlet e IBAction se si utilizza il builder di interfacce (quindi il prefisso IB) per i componenti della GUI. IBOutlet è necessario per associare le proprietà nell'applicazione ai componenti in IB e IBAction viene utilizzato per consentire ai metodi di essere associati alle azioni in IB.

Ad esempio, supponiamo di definire un pulsante e un'etichetta in IB. Per modificare dinamicamente il valore dell'etichetta premendo il pulsante, definirai un'azione e una proprietà nella tua app simili a:

UILabel IBOutlet *myLabel;
- (IBAction)pushme:(id)sender;

Quindi in IB collegheresti myLabel con l'etichetta e collegheresti il ​​metodo pushme con il pulsante. È necessario IBAction e IBOutlet affinché queste connessioni esistano in IB.


13
ma perché funziona ancora se non includi l'etichetta IBOutlet ...?
Bobobobo,

7
Dato che queste macro non fanno nulla al momento della compilazione, sono semplicemente così che l'app di costruzione dell'interfaccia può trovare quei metodi e file del builder di interfaccia nel codice sorgente in modo che tu possa trascinare tra il builder di interfaccia e il tuo codice, una connessione è fatta non non importa più.
Nathan Day,

IBAction non fa nulla in fase di modifica, almeno, nell'ultimo decennio. Puoi anche connettere un (void)metodo in Interface Builder.
J. Cocoe,

7

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

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


7

Sono entrato nel diagramma osservando la codifica dei valori-chiave, pensando che potesse aiutare qualcuno. Aiuta a comprendere cos'è IBOutlet.

Guardando il flusso, si potrebbe vedere che IBOutlet sono lì solo per abbinare il nome della proprietà con un nome di controllo nel file Nib.

Come viene caricato il file pennino, screenshot del libro online di Matt per iOS6


Questa risposta spiega perché e come funzionano gli IBOutlet, non solo quello che fanno .
Jeffery Opoku-Mensah,

4

Un outlet è un collegamento dal codice all'interfaccia utente. Se si desidera mostrare o nascondere un elemento dell'interfaccia utente, se si desidera ottenere il testo di un campo di testo o abilitare o disabilitare un elemento (o un centinaio di altre cose), è necessario definire un punto vendita di quell'oggetto nelle fonti e collegarlo attraverso l '"oggetto interfaccia" verso l'elemento UI. Successivamente è possibile utilizzare l'outlet proprio come qualsiasi altra variabile nella codifica.

IBAction - un metodo speciale attivato da 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


Uhm, no, non è quello che è un IBOutlet. Dove hai preso quell'idea?
Richard J. Ross III,

3

IBAction e IBOutlet sono utilizzati per collegare l'interfaccia creata in Interface Builder con il controller. Se non utilizzassi Interface Builder e costruissi la tua interfaccia completamente in codice, potresti creare un programma senza usarli. Ma in realtà la maggior parte di noi usa Interface Builder, una volta che si desidera ottenere interattività nella propria interfaccia, è necessario utilizzare IBActions e IBoutlets.


2

IBOutlet

  • Si tratta di una proprietà .
  • Quando viene caricato il file pennino (IB), diventa parte dei dati incapsulati che si collegano a una variabile di istanza.
  • Ogni connessione è non archiviata e ristabilita.

IBAction

  • L'attributo indica che il metodo è un'azione a cui è possibile connettersi dallo storyboard in Interface Builder.

@ - Dynamic pattern IB - Interface Builder


2

Uno dei principali commenti su questa domanda chiede specificamente:

Tutte le risposte menzionano lo stesso tipo di idea .. ma nessuno spiega perché Interface Builder sembra funzionare allo stesso modo se NON includi IBAction / IBOutlet nella tua fonte. C'è un altro motivo per IBAction e IBOutlet o va bene lasciarli fuori?


NSHipster risponde bene a questa domanda:

IBAction

https://nshipster.com/ibaction-iboutlet-iboutletcollection/#ibaction

Già nel 2004 (e forse prima), IBAction non era più necessario affinché un metodo fosse notato da Interface Builder. Qualsiasi metodo con la firma -(void){name}:(id)sendersarebbe visibile nel riquadro delle prese.

Tuttavia, molti sviluppatori ritengono utile utilizzare ancora il tipo di ritorno IBAction nelle dichiarazioni dei metodi per indicare che un determinato metodo è collegato a un'azione. Anche i progetti che non utilizzano Storyboard / XIB possono scegliere di utilizzare IBAction per richiamare i metodi target / action.

IBOutlet:

https://nshipster.com/ibaction-iboutlet-iboutletcollection/#iboutlet

A differenza di IBAction, IBOutlet è ancora richiesto per collegare proprietà nel codice con oggetti in uno Storyboard o XIB.

Di solito viene stabilita una connessione IBOutlet tra una vista o un controllo e il relativo controller della vista di gestione (ciò viene spesso eseguito in aggiunta a qualsiasi IBAction che un controller di vista potrebbe essere targetizzato da un risponditore). Tuttavia, un IBOutlet può essere utilizzato anche per esporre una proprietà di livello superiore, come un altro controller o una proprietà a cui potrebbe accedere un controller della vista di riferimento.


1

quando usi Interface Builder, puoi usare Connections Inspector per impostare gli eventi con i gestori di eventi, i gestori di eventi dovrebbero essere le funzioni che hanno il modificatore IBAction. Una vista può essere collegata con il riferimento per lo stesso tipo e con il modificatore IBOutlet.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.