दिलचस्प पोस्ट
यूट्यूब लिंक के लिए नियमित अभिव्यक्ति किसी फ़ोल्डर के आकार की गणना करें विधि पैरामीटर और स्थानीय चर के लिए अंतिम उपयोग करना चाहिए? पिछले फ़ंक्शन के पूरा होने के बाद फ़ंक्शन को कॉल करें दो परियोजनाओं के बीच क्रॉस-परियोजना संदर्भ एंड्रॉइड में SSL ट्रस्ट प्रबंधक को ओवरराइड करना गेटलाइन ठीक से काम नहीं कर रहा है? कारण क्या हो सकता है? C ++ हेडर फाइलों के लिए विज़ुअल स्टूडियो कहाँ दिखता है? वेबएपीआई में लंबे समय से चल रहे कार्य क्या यह मैन्युअल रूप से बंद करने और SqlDataReader के निपटान के लिए आवश्यक है? जेएसपी के बीच अंतर और पुनर्निर्देशन कौन सी एन्कोडिंग मैक और विंडोज दोनों पर Excel के साथ सीएसवी फाइलों को सही ढंग से खोलता है? वेरिएबल और फ़ंक्शन के नामों के लिए पायथन में नेमिंग सम्मेलन क्या है? <Li> के अंदर स्वीकृत टैग क्या हैं? मैं .NET के साथ एक विशिष्ट एक्सटेंशन के साथ एक अस्थायी फ़ाइल कैसे बना सकता हूं?

उद्देश्य-सी: एकाधिक तर्कों के साथ चयनकर्ताओं को कॉल करना

MyClass.m में, मैंने परिभाषित किया है

- (void) myTest: (NSString *) withAString{ NSLog(@"hi, %@", withAString); } 

और MyClass.h में उचित घोषणा। बाद में मैं कॉल करना चाहता हूं

 [self performSelector:@selector(mytest:withAString:) withObject: mystring]; 

MyClass.m में लेकिन मुझे एक त्रुटि मिलती है * बिना किसी अपवाद के 'एपीआई' को रद्द करने की वजह से 'एनएसआईएनआईडीआईडीएआरएगमेंट एक्स्प्शन', कारण: '* – [मायक्लास मायटेस्ट: साथएटिंग:]: अपरिचित चयनकर्ता को उदाहरण 0xe421f0'

मैंने एक चयनकर्ता के साथ एक सरल मामला की कोशिश की, जिसने कोई तर्क नहीं लिया जो कंसोल के लिए एक स्ट्रिंग मुद्रित करता था और यह ठीक काम करता था। कोड में क्या गलत है और मैं इसे कैसे ठीक कर सकता हूं? धन्यवाद।

Solutions Collecting From Web of "उद्देश्य-सी: एकाधिक तर्कों के साथ चयनकर्ताओं को कॉल करना"

आपका तरीका हस्ताक्षर है:

 - (void) myTest:(NSString *) 

सशर्त के साथ पैरामीटर होता है (नाम भ्रामक है, ऐसा लगता है कि यह चयनकर्ता के हस्ताक्षर का हिस्सा है)।

यदि आप फ़ंक्शन को इस तरीके से कहते हैं:

 [self performSelector:@selector(myTest:) withObject:myString]; 

यह काम करेगा।

लेकिन, जैसा कि अन्य पोस्टर ने सुझाया है, आप इस विधि का नाम बदलना चाह सकते हैं:

 - (void)myTestWithAString:(NSString*)aString; 

और कॉल करें:

 [self performSelector:@selector(myTestWithAString:) withObject:myString]; 

उद्देश्य-सी में, एक चयनकर्ता के हस्ताक्षर में निम्न शामिल हैं:

  1. विधि का नाम (इस मामले में यह 'myTest' होगा) (आवश्यक)
  2. विधि नाम के बाद ए ':' (बृहदान्त्र) यदि विधि में एक इनपुट होता है।
  3. प्रत्येक अतिरिक्त इनपुट के लिए एक नाम और ':'

चयनकर्ताओं का कोई ज्ञान नहीं है:

  1. इनपुट प्रकार
  2. विधि का वापसी प्रकार।

यहां एक क्लास का कार्यान्वयन है जहां performMethodsViaSelectors विधि चयनकर्ताओं के माध्यम से अन्य वर्ग तरीकों का प्रदर्शन करती है:

 @implementation ClassForSelectors - (void) fooNoInputs { NSLog(@"Does nothing"); } - (void) fooOneIput:(NSString*) first { NSLog(@"Logs %@", first); } - (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second { NSLog(@"Logs %@ then %@", first, second); } - (void) performMethodsViaSelectors { [self performSelector:@selector(fooNoInputs)]; [self performSelector:@selector(fooOneInput:) withObject:@"first"]; [self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second"]; } @end 

जिस विधि के लिए आप एक चयनकर्ता बनाना चाहते हैं उसके लिए एक इनपुट है, इसलिए आप इसके लिए एक चयनकर्ता बना सकते हैं:

 SEL myTestSelector = @selector(myTest:); 

@ शेन एरनी

 performSelector:withObject:withObject: 

आप यह भी उल्लेख कर सकते हैं कि यह विधि केवल अधिकतम 2 तर्कों को पारित करने के लिए है, और इसे विलंबित नहीं किया जा सकता है। (जैसे प्रदर्शन करने वाले के साथ performSelector:withObject:afterDelay:)

थोड़े अजीब है कि सेब केवल 2 ऑब्जेक्ट्स का समर्थन करता है और इसे और अधिक सामान्य नहीं बनाया

आपके कोड में दो समस्याएं हैं एक की पहचान की और उत्तर दिया गया था, लेकिन दूसरा नहीं था। पहला था कि आपके चयनकर्ता ने इसके पैरामीटर का नाम नहीं खोया था हालांकि, जब भी आप इसे ठीक करते हैं, तो लाइन अभी भी एक अपवाद बढ़ा देगा, मान लें कि आपके संशोधित विधि हस्ताक्षर में अभी भी एक से अधिक तर्क शामिल हैं मान लें कि आपके संशोधित विधि को घोषित किया गया है:

 -(void)myTestWithString:(NSString *)sourceString comparedTo:(NSString *)testString ; 

कई तर्कों को लेने वाले तरीकों के चयनकर्ताओं का निर्माण पूरी तरह से मान्य है (उदाहरण के लिए @selector (myTestWithString: comparisonTo :))। हालांकि, performSelector विधि केवल आपको एक मूल्य myTest के पास करने की अनुमति देता है, जो दुर्भाग्य से एक से अधिक पैरामीटर है। यह भूल जाएगा और आपको बताएगा कि आपने पर्याप्त मूल्य नहीं दिए हैं

आप एक संग्रह लेने के लिए हमेशा अपनी विधि को फिर से परिभाषित कर सकते हैं क्योंकि यह केवल पैरामीटर है:

 -(void)myTestWithObjects:(NSDictionary *)testObjects ; 

हालांकि, वहाँ एक और अधिक सुरुचिपूर्ण समाधान है (जिसे रिफैक्टरिंग की आवश्यकता नहीं है)। इसका उत्तर setArgument:atIndex: का उपयोग करना है, इसके setArgument:atIndex: के साथ setArgument:atIndex: और तरीके setArgument:atIndex:

मैंने एक लेख लिखा है , जिसमें कोड उदाहरण भी शामिल है , यदि आप अधिक विवरण चाहते हैं फोकस थ्रेडिंग पर है, लेकिन मूल बातें अभी भी लागू होती हैं।

सौभाग्य!

आपकी विधि हस्ताक्षर कोई मतलब नहीं है, क्या आप सुनिश्चित हैं कि यह कोई टाइपो नहीं है? मैं यह स्पष्ट नहीं कर रहा हूं कि यह भी संकलन कर रहा है, हालांकि शायद आप उन चेतावनियां पा रहे हैं जिन्हें आप अनदेखी कर रहे हैं?

आपको यह विधि कितने मापदंडों की अपेक्षा करते हैं?

सोचें कि कक्षा को इस प्रकार परिभाषित किया जाना चाहिए:

 - (void) myTestWithSomeString:(NSString *) astring{ NSLog(@"hi, %s", astring); } 

आपके पास केवल एक पैरामीटर है, इसलिए आपके पास केवल एक ही होना चाहिए:

आप अपने एनएसएलॉग में% @ का उपयोग करने पर भी विचार करना चाह सकते हैं – इसमें शामिल होने की अच्छी आदत है – फिर कोई भी वस्तु लिखना होगा – न सिर्फ स्ट्रिंग्स

आईओएस उपयोगकर्ताओं को भी ऑटोकैपिटलाइजेशन की उम्मीद है: एक मानक टेक्स्ट फ़ील्ड में, केस-संवेदी भाषा में एक वाक्य का पहला अक्षर स्वतः कैपिटल होता है।

आप यह तय कर सकते हैं कि इन सुविधाओं को लागू करने या नहीं; केवल सूचीबद्ध किसी भी सुविधा के लिए कोई समर्पित एपीआई नहीं है, इसलिए उन्हें प्रदान करना प्रतिस्पर्धात्मक लाभ है।

एप्पल दस्तावेज़ कह रहा है कि इस सुविधा के लिए कोई कस्टम उपलब्ध नहीं है और कस्टम कीबोर्ड में कुछ अन्य उम्मीद की सुविधा है। इसलिए आपको इसे लागू करने के लिए अपना तर्क जानने की आवश्यकता है।