2010-12-02 13 views
9

का जवाब नहीं दे सकता है मेरे पास एक कक्षा है जिसमें एक संपत्ति के रूप में UIView है। कभी-कभी मैं यूलाबेल में जाता हूं; कभी-कभी UITextField। कोई फर्क नहीं पड़ता कि मैं किस पास गुजरता हूं, मैं कक्षा को पाठ सेट करना चाहता हूं। वर्तमान में मैं यह कर रहा हूं, जो काम करता है:UIView के लिए चेतावनी को रोकने के लिए कैसे चयनकर्ता

if ([self.viewToUpdate respondsToSelector:@selector(setText:)] && !self.newAnswer) 
    [self.viewToUpdate setText:[[self.choices objectAtIndex:indexPath.row] text]]; 

समस्या है, यह एक चेतावनी देता है, क्योंकि भले मैं respondsToSelector जाँच कर रहा हूँ हालांकि, Xcode पता नहीं है कि मेरी UIView setText: का जवाब देंगे। मैं इस चेतावनी को कैसे हटा सकता हूं?

मुझे पता है कि मैं विशेष रूप से यह देखने के लिए जांच सकता हूं कि यह टेक्स्टफिल्ड या लेबल है, और उसके बाद क्रमशः टेक्स्टफ़िल्ल्ड या लेबल पर डाला गया है, लेकिन यह दर्द होगा, और यदि मेरे पास कभी भी अधिक प्रकार के विचार हैं, मुझे प्रत्येक के लिए कोड की कुछ और पंक्तियां जोड़नी होंगी।

मैं अपने खुद के प्रोटोकॉल बनाने, और उसके बाद मेरी कक्षा होने के बारे में सोचा viewToUpdate के लिए प्रकार के रूप में पहचान है ... लेकिन निश्चित रूप से UITextField और UILabel कि प्रोटोकॉल के अनुरूप नहीं हैं ...

उत्तर

16

सिर्फ कास्टिंग की कोशिश यह एक आईडी के रूप में:

if ([self.viewToUpdate respondsToSelector:@selector(setText:)] && !self.newAnswer) 
    [(id)self.viewToUpdate setText:[[self.choices objectAtIndex:indexPath.row] text]]; 
+0

धन्यवाद! विश्वास नहीं कर सकता मैंने उस बारे में नहीं सोचा था। बहुत आसन! हालांकि (आईडी) को दूसरी पंक्ति पर रखा जाना चाहिए, पहले नहीं। – GendoIkari

+0

जो लोग, अच्छी कॉल! बस बदलाव किया। –

+0

आप ऑब्जेक्ट का परीक्षण करने के लिए बेहतर प्रदर्शन करेंगे कि यह उस कक्षा का है जिसे आप उम्मीद करते हैं, फिर उस विशिष्ट वर्ग को कास्टिंग करें, सीधे आईडी पर कास्टिंग करने से। कम से कम तो आप एक दुर्घटना से बचेंगे अगर self.viewToUpdate अब की तुलना में एक अलग वर्ग था। – Ryan

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