IBOutlet und IBAction

159

Was ist der Zweck der Verwendung von IBOutlets und IBActions in Xcode und Interface Builder?

Macht es einen Unterschied, wenn ich keine IBOutlets und IBActions verwende?


Schnell:

@IBOutlet weak var textField: UITextField!

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

Ziel c:

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

- (IBAction)buttonPressed:(id)sender { /* ... */ }
suse
quelle
12
Alle Antworten erwähnen dieselbe Art von Idee. Aber niemand erklärt, warum Interface Builder genauso zu funktionieren scheint, wenn Sie IBAction / IBOutlet NICHT in Ihre Quelle aufnehmen. Gibt es einen anderen Grund für IBAction und IBOutlet oder ist es in Ordnung, sie wegzulassen ?
Bobobobo
2
Die Antwort von Michael Rogers unten enthält eine Erklärung, warum der Code auch dann funktioniert, wenn IBAction weggelassen wird.
Krishna
IBActions sind Teil des Ziel-Aktions-Interaktionsmechanismus. Informationen dazu, wie IBAction dazu passt, finden Sie hier: developer.apple.com/library/ios/documentation/General/… Informationen zu Outlets finden Sie hier: developer.apple. com / library / ios / documentation / General /…
William Power

Antworten:

208

IBActionund IBOutletsind Makros, die definiert sind, um Variablen und Methoden zu bezeichnen, auf die im Interface Builder verwiesen werden kann.

IBActionwird in nichts aufgelöst voidund IBOutletin nichts aufgelöst, aber sie bedeuten für Xcode und den Interface Builder, dass diese Variablen und Methoden im Interface Builder verwendet werden können, um UI-Elemente mit Ihrem Code zu verknüpfen.

Wenn Sie Interface Builder überhaupt nicht verwenden, benötigen Sie sie nicht in Ihrem Code. Wenn Sie sie jedoch verwenden möchten, müssen Sie angeben, welche IBActionMethoden in IB und IBOutletfür Objekte verwendet werden sollen das wird in IB verwendet.

Jasarien
quelle
@Jasarien "Sie müssen IBAction für Methoden angeben, die in IB verwendet werden, und IBOutlet für Objekte, die in IB verwendet werden." Was ist der Unterschied ?
Cyrilchampier
3
@nerith Der gleiche Unterschied, der zwischen Methoden und Objekten besteht. IBActions für Methoden, IBOutlet für Objekte.
Jasarien
Nur zur Klarstellung, da mein Beitrag bearbeitet wurde, IBOutletlöst sich das nicht auf id. Beachten Sie Folgendes: IBOutlet UILabel *nameLabel;- falls IBOutletgelöst zuid , wird der Code gelesen, id UIlabel *namelabel;der einen Compilerfehler erzeugt. Wie ich ursprünglich sagte, IBOutletlöst sich nichts auf.
Jasarien
38

Die traditionelle Methode, eine Methode so zu kennzeichnen, dass sie im Interface Builder angezeigt wird und Sie eine Verbindung dazu ziehen können, bestand darin, die Methode vom Typ IBAction zurückzugeben. Wenn Sie jedoch stattdessen Ihre Methode ungültig machen (IBAction ist # define'd to void) und ein (id) -Argument angeben, ist die Methode weiterhin sichtbar. Dies bietet zusätzliche Flexibilität, al

Alle drei sind im Interface Builder sichtbar:

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

Weitere Informationen finden Sie im Apple Interface Builder-Benutzerhandbuch, insbesondere im Abschnitt Xcode-Integration.

Michael Rogers
quelle
1
Hier ist ein Link zu der oben vorgeschlagenen Anleitung vorgeschlagen: developer.apple.com/library/ios/recipes/…
Aggressor
32

Sie müssen IBOutlet und IBAction verwenden, wenn Sie den Interface Builder (daher das IB-Präfix) für Ihre GUI-Komponenten verwenden. IBOutlet wird benötigt, um Eigenschaften in Ihrer Anwendung Komponenten in IB zuzuordnen, und IBAction wird verwendet, um zu ermöglichen, dass Ihre Methoden Aktionen in IB zugeordnet werden.

Angenommen, Sie definieren eine Schaltfläche und eine Beschriftung in IB. Um den Wert der Beschriftung durch Drücken der Schaltfläche dynamisch zu ändern, definieren Sie in Ihrer App eine Aktion und eine Eigenschaft, die wie folgt aussehen:

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

Dann würden Sie in IB myLabel mit dem Label verbinden und die Pushme-Methode mit der Schaltfläche verbinden. Sie benötigen IBAction und IBOutlet, damit diese Verbindungen in IB vorhanden sind.

ennuikiller
quelle
13
Aber warum funktioniert es immer noch, wenn Sie die IBOutlet-Kennzeichnung nicht einschließen?
Bobobobo
7
Da diese Makros zur Kompilierungszeit nichts tun, kann die Interface-Build-App diese Methoden und Interface-Builder-Dateien einfach im Quellcode finden, sodass Sie zwischen dem Interface-Builder und Ihrem Code ziehen können, wenn die Verbindung hergestellt wird egal mehr.
Nathan Day
IBAction unternimmt auch zur Bearbeitungszeit zumindest in den letzten zehn Jahren nichts. Sie können eine (void)Methode auch in Interface Builder verbinden .
J. Cocoe
7

Interface Builder verwendet sie, um zu bestimmen, welche Mitglieder und Nachrichten mit den Schnittstellensteuerelementen verbunden werden können, die Sie in Ihrem Fenster / Ihrer Ansicht verwenden.

IBOutlet und IBAction dienen lediglich als Markierungen, nach denen Interface Builder sucht, wenn es Ihren Code zur Entwurfszeit analysiert. Sie haben keinen Einfluss auf den vom Compiler generierten Code.

KazR
quelle
7

Bin beim Betrachten der Schlüsselwertcodierung in das Diagramm geraten und dachte, es könnte jemandem helfen. Es hilft beim Verständnis, was IBOutlet ist.

Wenn man sich den Ablauf ansieht, kann man sehen, dass IBOutlets nur dazu da sind, den Eigenschaftsnamen mit einem Kontrollnamen in der Nib-Datei abzugleichen.

Wie die Nib-Datei geladen wird, Screenshot von Matts Online-Buch für iOS6

NSCoder
quelle
Diese Antwort erklärt, warum und wie IBOutlets funktionieren und nicht nur, was sie tun .
Jeffery Opoku-Mensah
4

Ein Outlet ist eine Verknüpfung vom Code zur Benutzeroberfläche. Wenn Sie ein UI-Element ein- oder ausblenden möchten, wenn Sie den Text eines Textfelds abrufen oder ein Element (oder hundert andere Dinge) aktivieren oder deaktivieren möchten, müssen Sie einen Ausgang dieses Objekts in den Quellen definieren und diesen Ausgang verknüpfen über das „Schnittstellenobjekt“ zum UI-Element. Danach können Sie den Ausgang wie jede andere Variable in Ihrer Codierung verwenden.

IBAction - eine spezielle Methode, die von Objekten der Benutzeroberfläche ausgelöst wird. Interface Builder erkennt sie.

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

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

Weitere Informationen finden Sie in den Apple-Dokumenten

पवन
quelle
Ähm, nein, das ist kein IBOutlet. Woher hast du diese Idee?
Richard J. Ross III
3

IBAction und IBOutlets werden verwendet, um Ihre in Interface Builder erstellte Schnittstelle mit Ihrem Controller zu verbinden. Wenn Sie Interface Builder nicht verwenden und Ihre Schnittstelle nicht vollständig in Code erstellen würden, könnten Sie ein Programm erstellen, ohne sie zu verwenden. In der Realität verwenden die meisten von uns jedoch den Interface Builder. Sobald Sie eine gewisse Interaktivität in Ihrer Benutzeroberfläche erzielen möchten, müssen Sie IBActions und IBoutlets verwenden.

Yannick Compernol
quelle
2

IBOutlet

  • Es ist eine Eigenschaft .
  • Wenn die nib (IB) -Datei geladen wird, wird sie Teil der gekapselten Daten, die eine Verbindung zu einer Instanzvariablen herstellen.
  • Jede Verbindung ist nicht archiviert und wird wiederhergestellt.

IBAction

  • Das Attribut gibt an, dass die Methode eine Aktion ist, zu der Sie über Ihr Storyboard in Interface Builder eine Verbindung herstellen können.

@ - Dynamisches Muster IB - Interface Builder

Vinoth Anandan
quelle
2

In einem der wichtigsten Kommentare zu dieser Frage wird speziell gefragt:

Alle Antworten erwähnen dieselbe Art von Idee. Aber niemand erklärt, warum Interface Builder genauso zu funktionieren scheint, wenn Sie IBAction / IBOutlet NICHT in Ihre Quelle aufnehmen. Gibt es einen anderen Grund für IBAction und IBOutlet oder ist es in Ordnung, sie wegzulassen ?


Diese Frage wird von NSHipster gut beantwortet:

IBAction

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

Bereits 2004 (und möglicherweise früher) war IBAction nicht mehr erforderlich, damit eine Methode von Interface Builder erkannt wurde . Jede Methode mit der Signatur wird -(void){name}:(id)senderim Auslassbereich angezeigt.

Dennoch finden es viele Entwickler nützlich, den Rückgabetyp IBAction in Methodendeklarationen weiterhin zu verwenden, um anzuzeigen, dass eine bestimmte Methode durch eine Aktion verbunden ist. Selbst Projekte, die keine Storyboards / XIBs verwenden, verwenden möglicherweise IBAction, um Ziel- / Aktionsmethoden aufzurufen.

IBOutlet:

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

Im Gegensatz zu IBAction wird IBOutlet weiterhin benötigt , um Eigenschaften im Code mit Objekten in einem Storyboard oder XIB zu verknüpfen.

Eine IBOutlet-Verbindung wird normalerweise zwischen einer Ansicht oder einem Steuerelement und dem verwaltenden Ansichtscontroller hergestellt (dies erfolgt häufig zusätzlich zu allen IBActions, auf die ein Ansichtscontroller möglicherweise von einem Responder ausgeführt werden soll). Ein IBOutlet kann jedoch auch verwendet werden, um eine Eigenschaft der obersten Ebene verfügbar zu machen, z. B. einen anderen Controller oder eine Eigenschaft, auf die dann ein Controller für die referenzierende Ansicht zugreifen kann.

pkamb
quelle
1

Wenn Sie den Interface Builder verwenden, können Sie mit Connections Inspector die Ereignisse mit Ereignishandlern einrichten. Die Ereignishandler sollten die Funktionen sein, die den Modifikator IBAction enthalten. Eine Ansicht kann mit der Referenz für denselben Typ und mit dem Modifikator IBOutlet verknüpft werden.

Zephyr
quelle