2009-02-28 15 views
31

मुझे इसे जल्द ही सारांशित करने दें: एक निब फ़ाइल में एक "फर्स्ट रेस्पॉन्डर" एक ऑब्जेक्ट है, जो यूआई नियंत्रण तत्व का प्रतिनिधित्व करता है जिसमें उपयोगकर्ता का फोकस होता है। इसलिए यदि उपयोगकर्ता नियंत्रण पर क्लिक करता है, तो निब सेट करता है जो यूआई नियंत्रण को फर्स्ट रेस्पॉन्डर के रूप में क्लिक करता है। मेरे ऐप में मैं निब से उस "फर्स्ट रेस्पॉन्डर" को आउटलेट बना सकता था, ताकि मैं उदाहरण के लिए क्लिक कर सकूं जो भी उपयोगकर्ता ने क्लिक करके सक्रिय किया है, "लाल फ़ॉन्ट रंग बनाएं" संदेश भेजें।"पहला जवाब" - क्या मुझे यह सही मिला?

और फिर, यदि यह पहला उत्तरदाता यूआई नियंत्रण उस संदेश को समझ में नहीं आता है, तो संदेश माता-पिता तत्व या दादा (और इसी तरह) यूआई नियंत्रण तत्व संदेश को समझने तक प्रतिक्रियाकर्ता श्रृंखला में पारित हो जाता है। अन्यथा इसे नजरअंदाज कर दिया जाएगा।

तो पहला उत्तरदाता हमेशा यूआई नियंत्रण में "लिंक" स्थापित करता है जिस पर ध्यान केंद्रित किया जाता है। क्या वह सही है?

उत्तर

42

सही अनुच्छेद, पहले पैराग्राफ में गलत कार्यान्वयन विवरण।

"पहले प्रतिसादी" एक NibFile में एक वस्तु है ...

नहीं है, वास्तव में, प्रथम प्रत्युत्तर nil है। एक यूआईबी नियंत्रण (उदाहरण के लिए, बटन) को एक निब में फर्स्ट रिस्पॉन्डर से कनेक्ट करना कोड में [control setTarget:nil] के बराबर है।

निब विंडो में फर्स्ट रेस्पॉन्डर नकली ऑब्जेक्ट का कारण यह है कि, आईबी में, आप एक ही समय में लक्ष्य और क्रिया निर्धारित करते हैं (लक्ष्य करने के लिए ctrl-drag, पॉप-अप मेनू से कार्रवाई चुनें)। आप कार्रवाई सेट नहीं कर सकते हैं और लक्ष्य को अनसेट कर सकते हैं, जैसे आप कोड में कर सकते हैं, ताकि इसे nil पर सेट किया जा सके, आपको स्पष्ट रूप से ऐसा करने की आवश्यकता है। यही पहला जवाब है: यह एक नकली वस्तु है जो nil का प्रतिनिधित्व करती है, ताकि आप एक विशिष्ट वास्तविक लक्ष्य पर सेट करते समय लक्ष्य और क्रिया को उसी तरह सेट कर सकें।

बेशक, आप इसका उपयोग nil पर कुछ और सेट करने के लिए नहीं कर सकते, केवल 'लक्ष्य' देख सकते हैं। आप इसका इस्तेमाल केवल प्रथम प्रतिक्रिया के लिए कर सकते हैं, कुछ और नहीं।

तो अगर एक UI नियंत्रण पर उपयोगकर्ता klicks, नोक सेट ...

निब कुछ भी नहीं है। यह सिर्फ डिस्क पर संग्रहीत वस्तुओं का एक फ्रीज-सूखे संग्रह है। यहां तक ​​कि जब आप NSNib को तुरंत चालू करते हैं, तो आप जो कुछ भी कर रहे हैं वह कुछ वस्तुओं को डिफ्रॉस्टिंग कर रहा है। यह चीजें हैं जो चीजें करते हैं।

हाथ में मामले में, जब आप निब से पहले रिस्पॉन्डर से जुड़े नियंत्रण को अनारक्षित करते हैं, तो इसका लक्ष्य nil पर सेट होता है (याद रखें, यही पहला जवाब वास्तव में है: nil का लक्ष्य)। जब नियंत्रण का लक्ष्य nil होता है, और उपयोगकर्ता उस पर क्लिक करता है, तो वह उस समय अपनी प्रतिक्रिया भेजता है जो प्रतिक्रियाकर्ता उस समय का पहला उत्तरदाता होता है।

आपका दूसरा और तीसरा पैराग्राफ सही है।

+0

धन्यवाद टूटा हुआ है। क्या आप "लक्ष्य" से क्या मतलब समझ सकते हैं? – Thanks

+0

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

+0

@ पीटर, उपरोक्त टिप्पणी में आपका लिंक टूटा हुआ है – Casebash

2

इस लिंक को देखें, यह एक अच्छी नौकरी बताता है। मुझे लगता है कि आप इसे का सार है:

http://cocoadev.com/FirstResponder

स्रोत से:

FirstResponder प्रत्युत्तर श्रृंखला में पहली वस्तु कि दिया जाता है एक घटना के लिए जवाब देने का अवसर है ।

+1

आपके द्वारा यहां पोस्ट किया गया लिंक वर्तमान में – GoreDefex

3

आपकी समझ अपूर्ण है। responder chain में आमतौर पर "यूआई नियंत्रण" के बारे में क्या लगता है, उससे अधिक शामिल है, जिसमें सबसे महत्वपूर्ण वर्तमान दस्तावेज़ भी शामिल है। बड़े लाभों में से एक यह है कि यह आपको अवधारणात्मक रूप से "वर्तमान" जो भी हो - वर्तमान विंडो, वर्तमान टेक्स्ट फ़ील्ड, वर्तमान दस्तावेज़ इत्यादि के साथ बातचीत करने की अनुमति देता है - इसे खोजने के लिए बहुत सारी गड़बड़ किए बिना।

2

एक उत्तरदाता कोई ऑब्जेक्ट है जो क्रियाओं (कॉल फ़ंक्शंस) करेगा जब ईवेंट (जैसे बटन पर क्लिक करना) होता है। उत्तरदाता श्रृंखला एक दूसरे में निहित वस्तुओं का एक अनुक्रम है - उदाहरण के लिए एक खिड़की के अंदर एक पैनल के अंदर एक बटन। जब कोई घटना होती है, तो हम तब तक श्रृंखला के माध्यम से पुन: प्रयास करते हैं जब तक कि हमें ऐसा ऑब्जेक्ट न मिल जाए जिसमें उत्तरदायी nil पर सेट न हो और जो इस घटना का जवाब दे सके। तो खिड़की में प्रत्येक बटन के लिए एक प्रतिक्रियाकर्ता वस्तु प्रदान करने के बजाय, हम पूरी खिड़की के लिए एक ही उत्तरदाता प्रदान कर सकते हैं। पहला उत्तरदाता केवल उत्तरदाता श्रृंखला के अंदर पहली वस्तु है - एक घटना को जोड़ने से पहले प्रतिक्रियाकर्ता को घटना को श्रृंखला पारित करने की अनुमति मिलती है।

संबंधित मुद्दे