2012-04-12 14 views
7

मैं UIView के भीतर सभी विचारों के माध्यम से जाने के बिना एक UIView के भीतर सभी UILabel रों पाने के लिए कोई तरीका होना चाहिए के भीतर सभी UILabels कैसे प्राप्त करें।एक UIView

मैं विचारों, UIButton रों, UIImageView रों के कई अन्य प्रकार है और यह भी उनमें से सभी के माध्यम से जाना लंबा हो जाएगा जब मैं सिर्फ UILabel रों की जरूरत है।

for (UIView *view in myView.subviews) 
{ 
    if([view isKindOfClass:[UILabel class]]) 
    { 
     UILabel *lbl = (UILabel*)view; 
    } 
} 

क्या यह संभव है या मैं सपना देख रहा हूँ:

मैं कुछ इस तरह से बचने के लिए कोशिश कर रहा हूँ?

+0

आप उन्हें कैसे बना सकता हूँ - इंटरफ़ेस बिल्डर में या कोड में? –

उत्तर

5

एक NSArray इवर आप करने के लिए सभी UILabel के जोड़ सकते हैं जो बनाएँ।

आप तो कोड में यह कर, तो बस

NSMutableArray *labels = [[NSMutableArray alloc] init]; 

// Repeat this for al labels 
UILabel *label = [[UILabel alloc] in... 
[labels addObject:label]; 

// Then 
self.labels = [labels copy]; 

आप आईबी इस

@property (nonatomic, strong) IBOutletCollection(UILabel) NSArray *labels; 

की तरह अपनी संपत्ति घोषित करने और इस के लिए सभी लेबल कनेक्ट का उपयोग करते हैं, जैसा कि आप UILabel बनाने ।

+0

जो मैं खोज रहा था, लेकिन अब तक का सबसे अच्छा जवाब नहीं है। – subharb

1

आप .. लेबल के लिए टैग संपत्ति सेट कर सकते हैं कुछ इस तरह ...

label.tag = 100; 

UILabel *lbl = [yourView viewWithTag:100]; 
+0

युक 'viewWithTag' का उपयोग नहीं करते हैं: –

+0

@ Paul.s के बहुत बेहतर तरीके हैं: टिप्पणी के लिए धन्यवाद .. मुझे पता है कि viewWithTag का उपयोग करने का नुकसान क्या है? – Aravindhan

+1

एफवाईआई मैं वोट नीचे जा रहा था, लेकिन मैंने फैसला किया कि यह थोड़ा कठोर होगा क्योंकि मुझे यह सुझाव बहुत पसंद है। यह सिर्फ थोड़ी नफ/आलसी है - अगर आपको किसी दृश्य के संदर्भ की आवश्यकता है और आपको पता है कि आपको इसकी आवश्यकता है, तो इसके बारे में एक इवर क्यों न बनाएं? मुझे संभावित रूप से बड़े दृश्य पदानुक्रम के माध्यम से प्रत्येक टैग को मनमाने ढंग से मूल्य के लिए पूछने के विचार को पसंद नहीं है जो गलती से बदला जा सकता है। इसके अलावा इस मामले में ओपी चाहता था कि कई विचार लौटे, जो यह एपीआई नहीं करेगा। –

4

मैन, आपको रिकर्सन का उपयोग करने की आवश्यकता है। (यदि आप टैग का उपयोग नहीं करना चाहते हैं)

इसे आजमाएं।

-(UIView *)checkChild:(UIView *)view{ 

    NSArray *arrayView = view.subviews; 
    UIView *returnView = nil; 

    for (UIView *auxView in arrayView) { 
     if ([auxView isKindOfClass:[UILabel class]]) { 
      return auxView; 
     }else{ 
      returnView = [self checkChild:auxView]; 
     } 
    } 
    return returnView; 
} 
+0

नाइस स्निपेट, आपको केवल एक तत्व को वापस करने के बजाय अपने पथ पर पाए गए तत्वों की एक सरणी वापस करनी चाहिए। आपको उस वर्ग के सबव्यूव्स से अंतिम तत्व भी मिलेगा, जिसे आप ढूंढ रहे हैं क्योंकि आप हमेशा नए तत्व के साथ अंतिम तत्व को ओवरराइट करते हैं। –

1

मैं @SiddharthaMoraes के दृष्टिकोण पसंद किया, लेकिन सभी तत्वों को अपने रास्ते पर पाया इकट्ठा करने के लिए बदल दिया। मैं UILabels मेरी UIViewController अंदर लिए देख रहा था और उन्हें नहीं मिल सका क्योंकि वे एक और UIView अंदर नेस्टेड जहां, तो यह प्रत्यावर्तन समस्या का समाधान करना चाहिए:

-(NSMutableArray *)checkChild:(UIView *)view{ 

    NSArray *arrayView = view.subviews; 
    NSMutableArray *arrayToReturn = [NSMutableArray new]; 

    for (UIView *auxView in arrayView) { 
     if ([auxView isKindOfClass:[MyLabel class]]) { 
      [arrayToReturn addObject:auxView]; 
     }else if(auxView.subviews){ 
      [arrayToReturn addObjectsFromArray:[self checkChild:auxView]]; 
     } 
    } 
    return arrayToReturn; 
}