2010-05-16 8 views
5

Ich kann diese Antwort nirgendwo finden. Was bedeutet es, wenn ein Absenderparameter in einem Methodenkopf vorhanden ist? Stellt es die Instanz dar, die es aufgerufen hat, oder die Methode, die es aufgerufen hat?Was ist Absender?

Antwort

3

Es ist keine Magie beteiligt. Sie sprechen wahrscheinlich über die Methoden, die mit einigen Benutzeroberflächenelementen durch Interface Builder verknüpft sind, oder?

- (IBAction) userDidPressButton: (id) sender {...} 

Die IBAction ist ein Makro, das zu leeren erweitert. Es ist einfach ein syntaktischer Zucker, der die Methoden kennzeichnet, die im Interface Builder verfügbar sein sollen. Nun, wenn Sie diese Methode zu einem gewissen Interface-Elemente verbinden, etwa eine Taste, IB die addTarget ruft ... Methode auf dem Button:

[button addTarget:yourObject action:@selector(userDidPressButton:) forEvent:...]; 

Und wenn Sie die Taste drücken, geht es durch die Liste der Aktionen und Brände Der userDidPressButton, übergibt sich als erstes Argument. Dies ist wahrscheinlich nicht so nützlich für Schaltflächen, aber Sie können auch den gleichen Mechanismus verwenden, um Änderungsereignisse von einem Schieberegler abzurufen, und in diesem Fall können Sie das Argument sender verwenden, um den Schiebereglerwert zu erhalten.

+1

Die zweite Hälfte Ihrer Antwort deckt Cocoa Touch, ist aber ungenau für Kakao, wobei jede Steuerung nur ein Ziel und Aktion auf einmal hat. Die einzigen Ausnahmen sind NSTableView und NSOutlineView, die immer noch nur ein Ziel pro Instanz haben, aber zwei Aktionsselektoren pro Instanz haben (eine für Klicks, eine für Doppelklicks). –

+0

Ja, ich arbeite nur mit Cocoa Touch, danke für die Klarstellung. – zoul

4

Was bedeutet es, wenn ein Senderparameter in einem Methodenkopf vorhanden ist? Stellt es die Instanz dar, die es aufgerufen hat, oder die Methode, die es aufgerufen hat?

Sehen Sie sich den Typ des Arguments an. Wahrscheinlichkeiten sind, es ist id. Das ist der Typ eines Objektzeigers. Sie haben Recht, dass es die Instanz ist, die die Nachricht gesendet hat.

Sie können eine Nachrichtauswähler auf eine Nachricht übergeben, aber der Typ dafür ist SEL, nicht id. Ebenso können Sie eine Methodenimplementierung an eine Nachricht übergeben, aber der Typ dafür ist IMP, nicht id.

Methoden, die ein einzelnes sender-Argument verwenden, sind in der Regel Aktionsmethoden, die normalerweise durch den Rückgabetyp IBAction identifiziert werden. Wie zoul sagte, wird IBAction für den Compiler auf void erweitert, was besagt, dass die Methode keinen Wert zurückgibt. Der Grund für IBAction ist, dass Interface Builder nach Methoden mit IBAction als Rückgabetyp sucht und sie als Aktionen erkennt, mit denen Sie ein Steuerelement verknüpfen können. Weitere Informationen zu Cocoa (Mac OS X) finden Sie unter “The Target-Action Mechanism” in the Cocoa Fundamentals Guide und Control and Cell Programming Topics for Cocoa. Weitere Informationen zu Cocoa Touch (iPhone/iPod touch/iPad) finden Sie unter “The Target-Action Mechanism” in the UIControl class reference

1

Natürlich gibt es eine Menge technischer Möglichkeiten, um dies zu beschreiben, Aber in 'no no' Theorie das Argument übergeben Absender ist nur das GUI-Objekt, das es passiert.

Wenn Sie diese Methode also mit einer bestimmten Schaltfläche verknüpfen, rufen wir Button1 auf, der Absender ist Button1 und damit alle Informationen, die für die Schaltfläche verfügbar sind. Größe, Text usw.

hoffe, das war genug.

Bryan

Verwandte Themen