2011-07-10 9 views
5

मेरे पास एक स्ट्रक्चर स्थिति है, इस तरह:प्रदर्शन करने के लिए संरचना पास करें चयनकर्ता: withObject: बाद के बाद:

typedef struct Position { int x, y; } Position; 

मैं इसे NSObject performSelector:withObject:afterDelay: में कैसे पास कर सकता हूं? इस तरह:

Position pos; 
pos.x = pos.y = 1; 
[self performSelector:@selector(foo:) 
      withObject:pos    // ERROR 
      afterDelay:5.0f]; 

संपादित करें: टाइपो

को ठीक करने के लिए कोड बदल दिया

उत्तर

3

आप NSValue वर्ग का उपयोग कर अपने कस्टम प्रकार लपेट सकता कोड बदल दिया है। त्रुटि यह है कि आपने विधि के लिए ऑब्जेक्ट संदर्भ प्रदान नहीं किया है।

NSValue की +(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type; कक्षा विधि का उपयोग करने का प्रयास करें। दूसरी ओर आप -(void)getValue:(void *)buffer; का उपयोग करके मूल्य पुनर्प्राप्त कर सकते हैं।

9

Uhm .. का प्रयोग कर एक CGPoint और

[self performSelector:@selector(foo:) 
      withObject:[NSValue valueWithCGPoint:CGPointMake(pos.x, pos.y)] 
      afterDelay:5.0f]; 

की तरह कुछ और इसे फिर से के रूप में

NSValue v; 
CGPoint point = [v CGPointValue]; 

दूर पूरी तरह से पढ़ने के लिए या स्थिति वर्ग छोड़ देते हैं, CGPoint करता है एक ही

0

preformSelector:withObject: स्वीकार करता है केवल पैरामीटर के रूप में ऑब्जेक्ट्स, इसलिए आपको किसी ऑब्जेक्ट को स्वीकार करने के लिए अपने foo: विधि को लागू करना होगा।

  • एक struct जैसी वस्तु बना सकते हैं या
  • NSValue में लपेट और विधि में यह खोलने: वहाँ एक वस्तु के रूप struct पारित करने के लिए दो तरीके हैं।
0

उपयोगकर्ता 756245 के आधार पर पूर्ण उत्तर, जो आपको यह नहीं बताता कि इसका उपयोग कैसे करें, बहुत मदद नहीं है)। इसके अलावा, एप्पल आप थोड़ा अलग विधि इन दिनों, IIRC का उपयोग पता चलता है:

typedef myStruct { int a; } myStruct; 

myStruct aLocalPointer = ... assign to it 

[self performSelector:@selector(myOtherMethod:) withObject:[NSValue value:&aLocalPointer withObjCType:@encode(myStruct)] afterDelay:0.25]; 
0

यह सबसे अधिक संभावना मुसीबत के लिए पूछ रहा है, लेकिन आप इस तरह से यह ब्रिजिंग द्वारा CGPointid के रूप में पारित कर सकते हैं:

withObject:(__bridge id)((void *)(&point))

यदि point गुंजाइश से बाहर हो जाता है तो यह एक क्रैश का कारण बन जाएगा और आपका चयनकर्ता इसे पढ़ने की कोशिश करता है।

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

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