कक्षा के सबव्यू में सभी 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
का एक तर्क लेता है। यहां इस्तेमाल किया जाने वाला प्रकार निश्चित रूप से पहले तर्क के रूप में पारित होना चाहिए। हालांकि अब तक मुझे इस प्रकार को और अधिक सुरक्षित बनाने का कोई तरीका नहीं पता है।
मैं मानता हूं कि मुझे isKindOfClass के बजाय MemberOfClass का उपयोग करना चाहिए। हालांकि जिस समस्या को मैं इंगित कर रहा था वह यह है कि मैं एक ब्लॉक पास कर सकता हूं जो किसी भी प्रकार का तर्क लेता है। जहां तर्क दयालु UIView का होना चाहिए या इससे प्राप्त किया जाना चाहिए। अधिक विशेष रूप से यह उसी वर्ग का होना चाहिए जैसा कि व्यू टाइप विधि में पास हो गया है। – Nils
फिर आपको ब्लॉक को ब्लॉक करने के लिए कक्षा को पास करना होगा और ब्लॉक के अंदर कक्षा सुरक्षा की जांच करनी होगी। दूसरा तरीका आपके ब्लॉक तर्क में 'टाइपोफ (क्लास) सबव्यू' का उपयोग करना है, लेकिन इससे आपकी विधि कुछ बाहरी चर के आश्रित हो जाएगी। –
यह बहुत ही सुरुचिपूर्ण नहीं लगता है। तो आप उपरोक्त विधि पर कुछ भी नहीं बदलेंगे? – Nils