Was ist der Zweck der Verwendung IBAction und IBOutlet in Objective-C-Codierung für das iPhone, macht es einen Unterschied, wenn ich sie nicht verwende?IBOutlet und IBAction
Antwort
IBAction
und IBOutlet
sind Makros definiert, um Variablen und Methoden zu bezeichnen, auf die in Interface Builder verwiesen werden kann.
IBAction
beschließt, void
und IBOutlet
löst nichts, aber sie bedeuten zu Xcode und Interface Builder, die diese Variablen und Methoden können im Interface Builder verwendet werden UI-Elemente, um Ihren Code zu verknüpfen.
Wenn Sie den Interface Builder überhaupt nicht verwenden möchten, brauchen Sie sie nicht in Ihrem Code, aber wenn Sie ihn verwenden möchten, müssen Sie IBAction
für Methoden angeben, die verwendet werden in IB und IBOutlet
für Objekte, die in IB verwendet werden.
@Jasarien „müssen Sie IBAction für Methoden angeben, die in IB und IBOutlet für Objekte verwendet werden, die in IB verwendet werden.“ Was ist der Unterschied? – cyrilchampier
@nerith Derselbe Unterschied, der zwischen Methoden und Objekten besteht. IBActions für Methoden, IBOutlet für Objekte. – Jasarien
Nur um zu verdeutlichen, da 'IBOutlet' meinen Beitrag bearbeitet hat, wird 'idOutlet' nicht aufgelöst. Man beachte dies: 'IBOutlet UILabel * nameLabel;' - Wenn 'IBOutlet' in 'id' aufgelöst wird, dann würde dieser Code' id UIlabel * namelabel; 'lesen, was einen Compilerfehler erzeugt. Wie ich ursprünglich sagte, verrechnet sich 'IBOutlet' zu nichts. – Jasarien
Sie müssen IBOutlet und IBAction verwenden, wenn Sie Interface Builder (daher das IB-Präfix) für Ihre GUI-Komponenten verwenden. IBOutlet wird benötigt, um Eigenschaften in Ihrer Anwendung mit Komponenten in IB zu verknüpfen, und IBAction wird verwendet, um Ihre Methoden mit Aktionen in IB in Verbindung zu bringen.
Angenommen, Sie definieren eine Schaltfläche und eine Bezeichnung in IB. Um dynamisch den Wert des Etiketts verändert, indem Sie die Taste drücken, werden Sie eine Aktion und Eigentum in Ihrer Anwendung definieren ähnlich wie:
UILabel IBOutlet *myLabel;
-(IBAction) pushme;
Dann in IB Sie myLabel mit dem Etikett und schließen Sie das pushme Verfahren mit dem in Verbindung bringen würde Taste. Sie benötigen IBAction und IBOutlet, damit diese Verbindungen in IB existieren.
aber warum __still es work__, wenn Sie die IBOutlet Kennzeichnung nicht beinhalten ..? – bobobobo
Da diese Makros nichts bei der Kompilierung zu tun, sie sind einfach so die Schnittstelle Build App kann diese Methoden und Interface Builder-Dateien im Quellcode finden, so dass Sie zwischen dem Interface Builder und Ihrem Code ziehen, eine der Verbindung hergestellt ist es doesn‘ t Sache mehr. –
IBAction tut auch zur Bearbeitungszeit nichts, zumindest seit dem letzten Jahrzehnt. Sie können auch eine '(void)' Methode in Interface Builder verbinden. –
IBAction und IBOutlets werden verwendet, um Ihre in Interface Builder erstellte Schnittstelle mit Ihrem Controller zu verbinden. Wenn Sie den Interface Builder nicht verwenden und Ihre Schnittstelle vollständig im Code erstellen würden, könnten Sie ein Programm erstellen, ohne sie zu verwenden. Aber in Wirklichkeit verwenden die meisten von uns den Interface Builder. Sobald Sie etwas Interaktivität in Ihre Oberfläche bringen wollen, müssen Sie IBActions und IBoutlets verwenden.
Interface Builder verwendet diese, um zu bestimmen, welche Mitglieder und Nachrichten mit den Interface-Steuerelementen, die Sie in Ihrem Fenster/View verwenden, verbunden werden können.
IBOutlet und IBAction sind rein dort als Marker, die Interface Builder sucht, wenn es Ihren Code zur Entwurfszeit analysiert, sie haben nicht auf den Code beeinflussen durch den Compiler erzeugt.
Die herkömmliche Möglichkeit, eine Methode so zu kennzeichnen, dass sie im Interface Builder angezeigt wird und Sie eine Verbindung dorthin ziehen können, besteht darin, dass die Methode den Typ IBAction zurückgibt. Wenn Sie jedoch Ihre Methode void machen (IBAction ist # define ist ungültig) und ein (id) -Argument bereitstellt, ist die Methode immer noch sichtbar. Dies sorgt für zusätzliche Flexibilität, al
Alle 3 dieser sichtbar sind von Interface Builder:
-(void) someMethod1:(id) sender;
-(IBAction) someMethod2;
-(IBAction) someMethod3:(id) sender;
Siehe Apples Interface Builder Benutzerhandbuch für Details, insbesondere den Abschnitt mit dem Titel Xcode Integration.
Hier ist ein Link auf die obige Anleitung vorgeschlagen: https://developer.apple.com/library/ios/recipes/xcode_help-interface_builder/_index.html – Aggressor
Ein Ausgang ist ein Link von Code zu UI. 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 in den Quellen einen Ausgang dieses Objekts definieren und diesen Ausgang verknüpfen über das "Interface-Objekt" zum UI-Element. Danach können Sie den Ausgang wie jede andere Variable in Ihrem Coding verwenden.
IBAction - eine spezielle Methode ausgelöst durch User-Interface-Objekte. Interface Builder erkennt sie.
@interface Controller
{
IBOutlet id textField; // links to TextField UI object
}
- (IBAction)doAction:(id)sender; // e.g. called when button pushed
Für weitere Informationen lesen Sie bitte Apple Docs
Ähm, nein, das ist nicht das, was ein IBOutlet ist. Woher hast du diese Idee? –
Ich habe meine Antwort bearbeitet –
wenn Sie Interface Builder verwenden, können Sie Connections Inspector verwenden, um die Ereignisse mit Ereignishandler einzurichten, werden die Event-Handler soll die Funktionen sein, die die IBAction haben Modifikator. Eine Sicht kann mit der Referenz für denselben Typ und mit dem Modifizierer IBOutlet verknüpft werden.
in das Diagramm Ran während bei Schlüssel-Wert-Codierung suchen, dachte, es jemand helfen könnte. Es hilft beim Verständnis dessen, was IBOutlet ist.
Durch am Fluss sucht, konnte man sehen, dass IBOutlets ist nur dort mit einem Steuerelementnamen in der Nib-Datei mit dem Eigenschaftsnamen übereinstimmen.
Diese Antwort erklärt _why_ und _how_ IBOutlets arbeiten, nicht nur _What sie do_. –
Alle Antworten erwähnen die gleiche Art von Idee .. aber niemand erklärt, warum Interface Builder genauso zu funktionieren scheint, wenn Sie nicht IBAction/IBOutlet in Ihrer Quelle umfassen. Gibt es einen anderen Grund für IBAction und IBOutlet oder ist es __ok, um sie zu verlassen? – bobobobo
Die Antwort von Michael Rogers unten gibt ein bisschen Erklärung, warum der Code funktioniert, auch wenn IBAction weggelassen wird. – Krishna
IBActions existiert im Rahmen des Ziel Aktion Interaktion Mechanismus, können Sie lesen, wie IBAction paßt in dem hier: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Target-Action/ Target-Action.html # // apple_ref/doc/uid/TP40010810-CH12 Sie können bis auf Outlets hier lesen: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Outlets /Outlets.html#//apple_ref/doc/uid/TP40010810-CH10-SW1 –