2009-02-28 12 views
31

Lassen Sie mich das kurz zusammenfassen: Ein "First Responder" in einer NIB-Datei ist ein Objekt, das das UI-Steuerelement darstellt, auf das sich der Benutzer konzentriert. Wenn der Benutzer also auf ein Steuerelement klickt, setzt die Schreibfeder die Benutzeroberflächensteuerung auf First Responder. In meiner App könnte ich eine Steckdose zu diesem "First Responder" von der Spitze aus machen, so dass ich zum Beispiel eine Nachricht "mache rote Schriftfarbe" an alles senden könnte, was der Benutzer durch Klicken aktiviert hat."First Responder" - Habe ich das richtig verstanden?

Und dann, wenn dieses First Responder UI-Steuerelement diese Nachricht nicht versteht, wird die Nachricht in der Responder-Kette weitergegeben, bis ein Elternelement oder Großelternteil (und so weiter) UI-Steuerelement die Nachricht versteht. Ansonsten wird es ignoriert.

So erstellt First Responder immer einen "Link" zum UI-Steuerelement, das den Fokus hat. Ist das richtig?

Antwort

42

Richtiges Gesamtbild, falsche Implementierungsdetails im ersten Absatz.

A "First Responder" in einem NibFile ist ein Objekt ...

Nein, eigentlich ist First Responder nil. Das Verbinden eines UI-Steuerelements (z. B. einer Schaltfläche) mit dem First Responder in einer Schreibspitze entspricht [control setTarget:nil] im Code.

Der Grund für das Fake-Objekt des First Responders im Nib-Fenster ist, dass Sie in IB das Ziel und die Aktion gleichzeitig festlegen (Strg-Ziehen zum Ziel, wählen Sie Aktion aus dem Popup-Menü). Sie können die Aktion nicht festlegen und das Ziel wie im Code deaktiviert lassen. Um es auf nil zu setzen, müssen Sie dies explizit tun. Dafür ist der First Responder zuständig: Es handelt sich um ein falsches Objekt, das nil darstellt. Sie können das Ziel und die Aktion also genauso einstellen, wie Sie es bei einem bestimmten realen Ziel tun würden.

Natürlich können Sie dies nicht verwenden, um irgendetwas anderes auf nil, nur Ansichten 'Ziele. Sie können damit nur den First Responder verwenden, sonst nichts.

Also, wenn der Benutzer klicks auf einem UI-Steuerelement, das Nib setzt ...

Die Spitze nicht alles tun. Es ist nur eine gefriergetrocknete Sammlung von Objekten, die auf der Festplatte gespeichert sind. Selbst wenn Sie NSNib instanziieren, besteht alles darin, einige Objekte aufzutauen. Es sind die Objekte, die Dinge tun.

Wenn Sie das Steuerelement, das Sie mit First Responder über die Spitze verbunden haben, aus dem Archiv entfernen, wird das Ziel auf nil gesetzt (denken Sie daran, dass First Responder wirklich ein Ziel von nil ist). Wenn das Ziel eines Steuerelements nil ist und der Benutzer darauf klickt, sendet es seine Aktion an den jeweils zuständigen Ersthelfer.

Der zweite und dritte Absatz sind korrekt.

+0

danke. Kannst du erklären, was du mit "Ziel" meinst? – Thanks

+0

http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/chapter_6_section_5.html#//apple_ref/doc/uid/TP40002974-CH7-SW31 –

+0

@Peter, Ihr Link im obigen Kommentar ist beschädigt – Casebash

2

Überprüfen Sie diesen Link, es macht einen guten Job zu erklären. Ich denke, dass Sie den Kern von ihm haben:

http://cocoadev.com/FirstResponder

Von der Quelle:

Die FirstResponder ist das erste Objekt in der Responder-Kette, die die Gelegenheit gegeben wird, auf ein Ereignis zu reagieren .

+1

der Link, den Sie hier gepostet haben, ist derzeit gebrochen – GoreDefex

3

Ihr Verständnis ist unvollständig. Die enthält mehr als das, was wir normalerweise als "UI-Steuerelemente" bezeichnen würden, darunter vor allem das aktuelle Dokument. Einer der großen Vorteile ist, dass Sie mit dem konzeptuell "aktuellen" Fenster interagieren können - dem aktuellen Fenster, dem aktuellen Textfeld, dem aktuellen Dokument usw. - ohne viel herumzuspielen, um es zu finden.

2

Ein Responder ist ein Objekt, das Aktionen ausführt (Aufruffunktionen), wenn Ereignisse (z. B. das Klicken auf Schaltflächen) auftreten. Die Antwortkette ist eine Folge von Objekten, die jeweils ineinander enthalten sind - zum Beispiel eine Schaltfläche innerhalb eines Fensters in einem Fenster. Wenn ein Ereignis auftritt, durchlaufen wir die Kette so lange, bis wir ein Objekt finden, für das kein Responder auf nil gesetzt ist und der daher auf das Ereignis reagieren kann. Anstatt also für jede Schaltfläche in einem Fenster ein Responder-Objekt bereitzustellen, können wir einen einzelnen Responder für das gesamte Fenster bereitstellen. Der erste Responder ist einfach das erste Objekt innerhalb der Responder-Kette - die Verknüpfung eines Ereignisses mit dem First Responder ermöglicht es dem Ereignis, die Kette zu durchlaufen.