2016-03-23 8 views
1

Ich lerne Cocoa mit "Cocoa Programmieren für Mac OS X gerade (die Objective-C Edition)" und wann immer ich eine Schaltfläche mit Interface Builder erstelle, muss ich es mit einer der Klassen verbinden, mit denen ich gerade arbeite .Warum muss der Sendertyp einer IBAction ID sein?

Wenn ich Click-Drag von der Schaltfläche zu meiner AppDelegate.h-Datei steuern, wird Xcode automatisch die Schaltfläche an meine AppDelegate-Klasse haken. Wenn ich „Aktion“ wählen, wird es eine Methode wie folgt erstellen:

- (IBAction)onButtonPress:(id)sender { 
} 

Objective-C Methoden wie diese Arbeit:

- (returnType)methodName:(typeOfFirstArgument)firstArgumentName (typeOfSecondeArgument)secondArgumentName 

Warum muss ich den Typ id für den Sender anstelle von NSButton? Ich weiß, dass ich die Methode mit einem Knopf verbunden habe. Als Konsequenz erwarte ich, dass der Absender ein Objekt vom Typ NSButton ist.

Ich habe das versucht, aber es hat nicht funktioniert.

Antwort

2

Der Typ muss nicht id sein. Sie können den Typ und den Namen des Parameters auf jeden Fall ändern, entweder über das Popup beim Erstellen der Verbindung oder im Code.

id ist ein Typ, der "Zeiger auf irgendein ObjC-Objekt" bedeutet. Ein Zeiger auf eine bestimmte Klasse funktioniert genauso gut:

- (IBAction)onButtonPress:(NSButton *)importantButton; 
+2

Ein wichtiges Detail hier für Menschen neu in der Sprache ist, dass 'id' ein Generikum ist ** ** Zeiger, so dass, wenn Sie es ersetzen Sie verwenden müssen etwas wie 'NSButton *' und ** nicht ** 'NSButton'. –

+0

Uh! Das wusste ich nicht. Könnten Sie ein Beispiel nennen, warum Sie die ID über den eindeutigen Typ verwenden würden, den Sie erwarten? – user148013

+0

Sie würden "id" nur verwenden, wenn Sie erwarten, dass verschiedene Objekte diese Methode aufrufen und sich selbst anmelden müssen, @ user148013. Oder wenn Sie den Absender überhaupt nicht interessiert hätten. –

0

Antwort: Es muss keine ID sein, wenn Sie den kleinen Dialog anschauen, der aufging, wo Sie "Aktion" wählen und den Handler benennen, sehen Sie, dass Sie den tatsächlichen Typ des Objekts auswählen können, NSButton in Ihrem Beispiel.

Verwandte Themen