2009-02-28 12 views
31

Po krótce podsumuję: "Pierwszy obiekt odpowiadający" w pliku końcówki jest obiektem, który reprezentuje element sterujący interfejsu użytkownika, który ma fokus użytkownika. Jeśli więc użytkownik kliknie element sterujący, zestaw końcówek, w którym kliknięto interfejs użytkownika, jest pierwszym obiektem odpowiadającym. W mojej aplikacji mogłem zrobić wylot z "pierwszego obiektu" z końcówki, dzięki czemu mogłem na przykład wysłać wiadomość "utwórz czerwony kolor czcionki" do tego, co uaktywnił użytkownik, klikając."Pierwszy respondent" - Czy to rozumiem?

A następnie, jeśli ten element sterujący interfejsu First Responder nie zrozumie tego komunikatu, komunikat zostanie przekazany w łańcuchu respondenta, dopóki element nadrzędny elementu lub element nadrzędny (i tak dalej) nie rozpozna komunikatu. W przeciwnym razie zostanie zignorowany.

Pierwszy Responder zawsze ustanawia "link" do kontrolki interfejsu użytkownika, na której ustawiono ostrość. Czy to prawda?

Odpowiedz

42

Prawy ogólny obraz, błędne szczegóły implementacji w pierwszym akapicie.

A "First Responder" w NibFile jest obiektem ...

No, rzeczywiście, pierwsze Odpowiadający jest nil. Podłączenie kontrolki interfejsu użytkownika (np. Przycisku) do pierwszego obiektu odpowiedzi w końcówce jest równoznaczne z kodem [control setTarget:nil].

Powodem pierwszego obiektu fałszywego obiektu odpowiadającego w oknie końcówki jest to, że w IB ustawiasz cel i akcję w tym samym czasie (ctrl-przeciągnij do celu, wybierz akcję z wyskakującego menu). Nie możesz ustawić akcji i pozostawić cel niezałatwiony, tak jak w kodzie, więc aby ustawić go na nil, musisz to zrobić jawnie. Po to jest First Responder: jest to fałszywy obiekt reprezentujący nil, więc możesz ustawić cel i akcję w taki sam sposób, jak zrobiłbyś to przy ustawianiu go na konkretny cel.

Oczywiście nie można tego użyć do ustawienia niczego innego niż nil, tylko celów widoków. Możesz go używać tylko do oznaczania Pierwszego Respondenta, a nie do niczego innego.

Więc jeśli klików użytkownika na kontroli UI, ustawia stalówki ...

Stalówka nic nie robi. To tylko liofilizowany zbiór obiektów przechowywanych na dysku. Nawet gdy tworzysz NSNib, wszystko co robisz to rozmrażanie niektórych obiektów. To obiekty, które robią różne rzeczy.

W opisywanym przypadku, po cofnięciu archiwizacji elementu sterującego, który został połączony z pierwszym obiektem rozpoznawczym ze stalówki, jego cel jest ustawiony na nil (pamiętaj, że tak naprawdę jest to Pierwszy obiekt odpowiedzi: cel nil). Gdy cel kontrolny to nil, a użytkownik go kliknie, wysyła swoje działanie do tego, który responder jest pierwszym respondentem w danym momencie.

Twój drugi i trzeci akapit są poprawne.

+0

dzięki. Czy możesz wyjaśnić, co masz na myśli przez "cel"? – 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, Twój link w powyższym komentarzu jest uszkodzony – Casebash

2

Sprawdź ten link, który wyjaśnia się dobrze. Myślę, że mają sens nim:

http://cocoadev.com/FirstResponder

ze źródła:

FirstResponder jest pierwszym obiektem w łańcuchu reagujących że podano możliwość reagowania na zdarzenia .

+1

link, który tutaj zamieściłeś, jest obecnie uszkodzony – GoreDefex

3

Twoje zrozumienie jest niepełne. Model responder chain zawiera więcej niż zwykle nazywamy "kontrolkami interfejsu użytkownika", w tym najważniejszy dokument. Jedną z największych korzyści jest to, że pozwala on na interakcję z konceptualnym "bieżącym" czymkolwiek - bieżącym oknem, bieżącym polem tekstowym, bieżącym dokumentem, itp. - bez obrażania go, aby go znaleźć.

2

Respondentem jest każdy obiekt, który wykona akcje (funkcje wywołania), gdy wystąpią zdarzenia (takie jak kliknięcie przycisków). Łańcuch odpowiadający to sekwencja obiektów, z których każda zawiera się w sobie nawzajem - na przykład przycisk wewnątrz panelu w oknie. Kiedy wystąpi zdarzenie, wykonujemy iterację przez łańcuch, aż znajdziemy obiekt, który nie ma ustawionego respondenta na nil i który może w związku z tym odpowiedzieć na zdarzenie. Zamiast więc dostarczać obiekt odpowiadający dla każdego przycisku w oknie, możemy zapewnić pojedynczą odpowiedź dla całego okna. Pierwszy responder jest po prostu pierwszym obiektem w łańcuchu respondenta - powiązanie zdarzenia z pierwszym respondentem pozwala, aby zdarzenie przepuściło łańcuch.