2012-03-31 25 views
5

मैं एक prepareForSegue विधि में इस कोड है कॉलिंगऑब्जेक्टिव-सी एक चयनकर्ता कि संकलक विश्वास नहीं करता मौजूद है (भले ही हम जानते हैं कि यह करता है)

// Get destination view 
    UIViewController *viewController = [segue destinationViewController]; 

    //See if it responds to a selector 
    if ([viewController respondsToSelector:@selector(setSomethingOrOther:)]) { 
     //if so call it with some data 
     [viewController setSomethingOrOther:something]; 
    } 

कोड ऊपर का मतलब है मैं एक को शामिल करने की जरूरत नहीं है दृश्य नियंत्रक की वास्तविक कक्षा के संदर्भ में segue'd किया जा रहा है। मैं दो दृश्य नियंत्रकों को अधिक आसानी से जोड़ सकता हूं और जांच सकता हूं कि क्या यह उस पर सेट की जा रही कुछ संपत्ति का जवाब देता है।

समस्या यह है कि जब मैं इस मैं निम्नलिखित संकलन समय त्रुटि मिलती है:

'UIViewController' के लिए कोई दिखाई @interface चयनकर्ता वाणी 'setSomethingOrOther:'

जो निश्चित रूप से सच है । मुझे पता है कि मैं दृश्य के संदर्भ सहित इसे प्राप्त कर सकता हूं लेकिन मैं इसे अलग रखना पसंद करूंगा। मैं यह कैसे

उत्तर

10

उपयोग performSelector:aSelector विधि के आसपास काम कर सकते हैं, तो आप एक अघोषित चयनकर्ता कॉल कर सकते हैं।

+0

धन्यवाद, मुझे बेवकूफ लगता है। अन्य परिदृश्यों में यह एक उचित बिट का इस्तेमाल किया है। –

7
[viewController performSelector:@selector(setSomethingOrOther:) 
        withObject:something]; 
+0

अच्छा, स्पष्ट, कोड नमूना +1 –

3

तुम भी कुछ स्थिति में इस

[(id)viewController setSomethingOrOther:something]; 

कर सकते हैं, लेकिन मैं संकलक अगर यह setSomethingOrOther के अस्तित्व के बारे में पता नहीं है शिकायत: बिल्कुल, एक पुस्तकालय है कि आप शामिल नहीं किया है की तरह के लिए हेडर

+0

यह वास्तव में इस प्रश्न का मुद्दा है; मैं हेडर को बिल्कुल शामिल नहीं करना चाहता हूं। मैं अपने व्यू कंट्रोलर के बीच अधिक अलगाव चाहता हूं। –

+0

आपने मेरा जवाब ठीक से नहीं पढ़ा है, यह काम करेगा यदि विधि आपके पास कहीं भी परिभाषित की गई है, तो आप केवल हेडर को शामिल नहीं करना चाहते हैं। –

+0

ओह काफी उचित .. –

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

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