2010-12-29 19 views
5

एकाधिक तर्कों के साथ एक @ चयनकर्ता विधि को कैसे कॉल करता है?@ एकाधिक तर्कों के साथ चयनकर्ता

मैं निम्नलिखित

[self performSelector:@selector(changeImage:withString:) withObject:A1 withObject:fileString2 afterDelay:0.1]; 

है, लेकिन एक

गैर मान्यता प्राप्त चयनकर्ता उदाहरण के लिए भेजा मिल

त्रुटि

मेरे विधि मैं बोल रहा हूँ के रूप में

इस प्रकार है
-(void) changeImage: (UIButton *) button withString: (NSString *) string 
{ 
[button setImage:[UIImage imageNamed:string] forState:UIControlStateNormal]; 
} 

उत्तर

18

आप NSInvocation

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: 
          [self methodSignatureForSelector:@selector(changeImage:withString:)]]; 
[invocation setTarget:self]; 
[invocation setSelector:@selector(changeImage:withString:)]; 
[invocation setArgument:A1 atIndex:2]; 
[invocation setArgument:fileString2 atIndex:3]; 
[NSTimer scheduledTimerWithTimeInterval:0.1f invocation:invocation repeats:NO]; 
+0

कूल, धन्यवाद। मैं इसे कैसे कॉल करूं मैं इसे कई जगहों पर कॉल करना चाहता हूं। तो क्या इसेडिडलोड विधि में घोषित किया जा सकता है और फिर विभिन्न स्थानों पर बुलाया जा सकता है? – jarryd

+0

मैं वास्तव में समझ में नहीं आता कि आपका क्या मतलब है। आप कक्षा के इस टुकड़े को कक्षा में कहीं भी डाल सकते हैं जहां परिवर्तन Image: withString: परिभाषित किया गया है। यदि आप इसे कई बार कॉल करना चाहते हैं, तो आपको इसे एक विधि में लपेटना चाहिए और इसके बजाय उस विधि को कॉल करना चाहिए। – Jilouc

+1

वैकल्पिक रूप से, आप '[आमंत्रण प्रदर्शन चयनकर्ता: @ चयनकर्ता (Invoke) के साथ कर सकते हैं ऑब्जेक्ट: शून्य बाद के बाद: 0.1]; ' – user102008

0

आप performSelector:withObject:withObject:afterDelay: पर कॉल कर रहे हैं, लेकिन यह विधि मौजूद नहीं है।

आपका एकमात्र विकल्प performSelector:withObject:withObject: है, लेकिन आप उस विधि के साथ देरी निर्दिष्ट नहीं कर सकते हैं। यदि आपको देरी की आवश्यकता है, तो आपको शायद NSObject के लिए एक श्रेणी बनाना होगा और स्वयं एक नई विधि बनाएं।

4

NSObject वर्ग एक performSelector:withObject:afterDelay: विधि है, और NSObject प्रोटोकॉल एक performSelector:withObject:withObject: विधि निर्दिष्ट करता है, लेकिन कहीं भी वहाँ निर्दिष्ट एक performSelector:withObject:withObject:afterDelay: है।

इस मामले में, आपको अपनी इच्छित कार्यक्षमता प्राप्त करने के लिए NSInvocation का उपयोग करना होगा। आमंत्रण सेट अप करें, और उसके बाद आप चयनकर्ता invoke और nil ऑब्जेक्ट का उपयोग करके, आमंत्रण पर performSelector:withObject:afterDelay पर कॉल कर सकते हैं।

1

का उपयोग करना चाहिए यह दौर पाने के लिए एक अच्छा तरीका नहीं है, लेकिन अगर आप चाहते थे कि आप एक NSArray, स्वीकार करने के लिए जब सूचकांक 0 पर वस्तु बटन और पर है विधि को संशोधित कर सकता है सूचकांक 1 स्ट्रिंग है।

3

कई तर्कों के साथ चयनकर्ता को करने के लिए कोई विधि नहीं है और देरी। आप इस तरह इस को हल करने के लिए एक NSDictionary में बटन और स्ट्रिंग वस्तु लपेट सकता है:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:A1,@"button",fileString2,@"string",nil]; 
[self performSelector:@selector(changeWithDict:) withObject:dict afterDelay:0.1]; 
//... 

-(void)changeWithDict:(NSDictionary *)dict { 
    [[dict objectForKey:@"button"] setImage:[UIImage imageNamed:[dict objectForKey:@"string"]] forState:UIControlStateNormal]; 
} 
2

आप iOS 4.0+ आप ब्लॉक इस्तेमाल कर सकते हैं लक्षित कर रहे हैं। इस लाइन के साथ कुछ चाल चलाना चाहिए।

// Delay execution of my block for 0.1 seconds. 
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, USEC_PER_SEC/10ull), dispatch_get_current_queue(), ^{ 
    [self changeImage:A1 withString:fileString2]; 
}); 
+0

मैं इसे ध्यान में रखूंगा, लेकिन मैं 3.0 से लक्ष्यीकरण कर रहा हूं। – jarryd

+0

उस स्थिति में आपको दूसरों द्वारा प्रदान की गई एनएसआईएनवोकेशन विधि का उपयोग करने की आवश्यकता है। ब्लॉक केवल आईओएस 4.0 में पेश किए गए थे। – extremeboredom

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