2012-01-25 13 views
5

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

@implementation Util 

+ (void)iterateOverSubviewsOfType:(Class)viewType 
        view:(UIView*)view 
        blockToExecute:(void (^)(id subview))block 
{ 
    for (UIView* subview in view.subviews) { 
     if ([subview isKindOfClass:viewType]) { 
      block(subview); 
     } 
    } 
} 

@end 

ब्लॉक इस विधि के लिए पारित प्रकार id का एक तर्क लेता है। यहां इस्तेमाल किया जाने वाला प्रकार निश्चित रूप से पहले तर्क के रूप में पारित होना चाहिए। हालांकि अब तक मुझे इस प्रकार को और अधिक सुरक्षित बनाने का कोई तरीका नहीं पता है।

उत्तर

11

इसे इस तरह से आजमाएं, पर्याप्त सुरक्षित होना चाहिए।

for (id subview in view.subviews) { 
     if ([subview isMemberOfClass:viewType]) { 
      block(subview); 
     } 
    } 
+0

मैं मानता हूं कि मुझे isKindOfClass के बजाय MemberOfClass का उपयोग करना चाहिए। हालांकि जिस समस्या को मैं इंगित कर रहा था वह यह है कि मैं एक ब्लॉक पास कर सकता हूं जो किसी भी प्रकार का तर्क लेता है। जहां तर्क दयालु UIView का होना चाहिए या इससे प्राप्त किया जाना चाहिए। अधिक विशेष रूप से यह उसी वर्ग का होना चाहिए जैसा कि व्यू टाइप विधि में पास हो गया है। – Nils

+1

फिर आपको ब्लॉक को ब्लॉक करने के लिए कक्षा को पास करना होगा और ब्लॉक के अंदर कक्षा सुरक्षा की जांच करनी होगी। दूसरा तरीका आपके ब्लॉक तर्क में 'टाइपोफ (क्लास) सबव्यू' का उपयोग करना है, लेकिन इससे आपकी विधि कुछ बाहरी चर के आश्रित हो जाएगी। –

+0

यह बहुत ही सुरुचिपूर्ण नहीं लगता है। तो आप उपरोक्त विधि पर कुछ भी नहीं बदलेंगे? – Nils

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