2010-08-22 4 views
6

उद्देश्य-सी में चयनकर्ता किसी ऑब्जेक्ट को संदेश भेजने का एक और तरीका है? मैं वास्तव में समझ में नहीं आता क्यों उन्हें या क्यों उपयोग करें।उद्देश्य-सी में चयनकर्ता किसी ऑब्जेक्ट को संदेश भेजने का एक और तरीका है?

उत्तर

16

वे एक और तरीका है एक वस्तु के लिए एक संदेश भेजने के लिए नहीं हैं, वे एक ही तरीका है कर रहे हैं। उदाहरण के लिए, [myView setValue:@"foo"] में, setValue: एक चयनकर्ता है। (एक और, एक ही बात लिखने की कम सुविधाजनक तरीका objc_msgSend(myView, @selector(setValue:), @"foo") है।)

इयान हेनरी कहते हैं, आप SEL मूल्यों का उपयोग संकलन समय के बजाय कार्यावधि में एक चयनकर्ता का चयन कर सकते हैं। कोको में यह एक मौलिक तकनीक है; उपयोगकर्ता इंटरफेस आमतौर पर लक्ष्य/क्रिया बाइंडिंग का उपयोग कर नियंत्रकों से जुड़े होते हैं, जहां लक्ष्य एक वस्तु है और कार्रवाई एक चयनकर्ता है। आम तौर पर आप एक निब में सेट कर, लेकिन आप इसे कोड में भी कर सकते हैं:

[myButton setTarget:myController]; 
[myButton setAction:@selector(buttonClicked:)]; // Clicking the button will now call [myController buttonClick:myButton]. 
+1

ग्रेट उत्तर, लेकिन करने का क्या फायदा है: [myButton setAction: @selector (buttonClicked)] मेरे "सामान्य" संदेश के साथ सीधे मेरे नियंत्रक को संदेश भेजने के बजाय? – lampShade

+3

कार्रवाई सेट करके, बटन क्लिक होने पर संदेश भेजा जाता है। अगर आप सीधे संदेश भेजते हैं, तो यह "अब" होता है (यानी, जब यूआई सेट हो जाता है)। जब आप खिड़की लोड करते हैं तो आपके सभी बटन तुरंत क्लिक होते हैं आमतौर पर उपयोगी नहीं होते हैं। –

+1

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

3

सबसे बुनियादी पर, हाँ, लेकिन आप रनटाइम पर संदेश बदल सकते हैं।

SEL a = [selectorFactory getSelector]; 
[someOtherObject performSelector:a]; 

और फिर selectorFactory.getSelector में: उदाहरण के लिए:

if(foo == 1) 
    return @selector(thisSelector); 
else 
    return @selector(thatSelector); 

C# या किसी अन्य इसी तरह की भाषा से आ रहा है, आप के लिए (शिथिल) NSNotification s का उपयोग करके तुलना में अधिक आसानी घटनाओं अनुकरण कर सकती हैं। उदाहरण के लिए, आप दो आईवर, target और selector के साथ एक बटन क्लास बना सकते हैं, और जब बटन क्लिक किया जाता है तो बटन पर चयनकर्ता चयन करता है (उदाहरण के लिए)।

हालांकि, इसके अलावा चयनकर्ताओं के लिए बहुत कुछ है। यहाँ उनके बारे में और अधिक पढ़ें:

http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/articles/ocSelectors.html

4

आप चर के रूप में चयनकर्ताओं स्टोर कर सकते हैं, और बाद में या एक अलग संदर्भ में उन्हें आह्वान। उदाहरण के लिए आप किसी ऑब्जेक्ट को किसी विशेष समय पर, या किसी भिन्न थ्रेड पर चयनकर्ता करने के लिए कह सकते हैं। आप डेटा के आधार पर प्रदर्शन करने के लिए कौन सा चयनकर्ता चुन सकते हैं, यह है कि इंटरफ़ेस बिल्डर और कोर डेटा उनकी बात कैसे करते हैं।

21

चयनकर्ता आमतौर पर तब उपयोग किए जाते हैं जब आप कॉलबैक तंत्र को परिभाषित करना चाहते हैं। कोको में चयनकर्ताओं के लिए सबसे आम उपयोग केस बटन के साथ नियंत्रण के साथ है। एक UIButton बहुत सामान्य है, और इस तरह के बारे में पता नहीं है कि बटन दबाए जाने पर क्या होना चाहिए। इससे पहले कि आप एक का उपयोग कर सकें, आपको यह बताना होगा कि बटन दबाए जाने पर कौन सी विधि चलनी चाहिए।

[myButton addTarget:self 
      action:@selector(myButtonWasPressed) 
    forControlEvents:UIControlEventTouchUpInside]; 

- (void)myButtonWasPressed { 
    // Do something about it 
} 

तब, जब बटन दबाया जाता है, बटन लक्ष्य हम इसे पारित कर दिया पर चयनकर्ता कॉल करेंगे: यह इस प्रकार किया जाता है। इस तंत्र के साथ, हर बार जब आप इसे अपने कुछ कोड को कॉल करना चाहते हैं तो आपको बटन को उप-वर्ग करने की आवश्यकता नहीं है। इसके बजाए, UIButton में आपके द्वारा चुने गए किसी भी कोड को प्रेषित करने के लिए एक सामान्य तंत्र है। (ठीक है, तकनीकी तौर पर, यह सुपर क्लास UIControl कि प्रेषण तंत्र प्रदान किया है।)

0

--From Apple डेवलपर लाइब्रेरी -

एक चयनकर्ता एक विधि का चयन करने के लिए एक वस्तु पर अमल करने के लिए इस्तेमाल का नाम, या है अद्वितीय पहचानकर्ता जो स्रोत कोड संकलित होने पर नाम को प्रतिस्थापित करता है। स्वयं द्वारा एक चयनकर्ता कुछ भी नहीं करता है। यह बस एक विधि की पहचान करता है। एकमात्र चीज जो चयनकर्ता विधि का नाम सादा स्ट्रिंग से अलग करती है वह यह है कि संकलक सुनिश्चित करता है कि चयनकर्ता अद्वितीय हैं।एक चयनकर्ता उपयोगी बनाता है कि (रनटाइम के साथ संयोजन में) यह गतिशील फ़ंक्शन पॉइंटर की तरह कार्य करता है, जो किसी दिए गए नाम के लिए स्वचालित रूप से किसी भी वर्ग के लिए उपयुक्त विधि के कार्यान्वयन को इंगित करता है। मान लीजिए कि आपके पास विधि चलाने के लिए चयनकर्ता था, और कक्षा कुत्ते, एथलीट, और कंप्यूटर सिमुलेशन (जिनमें से प्रत्येक ने एक विधि को लागू किया)। चयनकर्ता का उपयोग प्रत्येक वर्ग के उदाहरण के साथ अपनी रन विधि का आह्वान करने के लिए किया जा सकता है - भले ही कार्यान्वयन प्रत्येक के लिए अलग हो।

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

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