2011-06-15 10 views
5

मेरे पास एक() लूप के साथ एक विधि है। उस लूप में, mylabel.text कई बार अद्यतन किया जाता है। हालांकि, जब तक विधि पूरी नहीं हो जाती है, तब तक वास्तविक लेबल स्क्रीन पर अपडेट नहीं होता है,() लूप में बनाए गए अंतिम मान के साथ अद्यतन करता है।एक के बीच में UILabel को अद्यतन करना() लूप

एनएसएलओजी का उपयोग करना, जो() लूप के बीच में अद्यतन करता है, मुझे लगता है कि लेबल कई बार वास्तव में बदल रहा है।

क्या यह आईओएस में सामान्य अभ्यास है कि() लूप के बीच में लेबल अपडेट न करें? मुझे लगता है कि ऐसा करने का एक तरीका है।

+0

आप 'UILabel' के मूल्य को कैसे अपडेट करते हैं? – Saphrosit

+2

संभावित डुप्लिकेट [गतिशील रूप से एक UILabel अद्यतन कर रहा है] (http://stackoverflow.com/questions/6336991/dynamically-updating-a-uilabel) और [टेक्स्ट फ़ील्ड अपडेट करने के लिए लूप के अंत तक प्रतीक्षा करता है] (http: // stackoverflow.com/questions/5829977/nstextfield-waits-until-the-end-of-a-loop-to-update) और [लेबल टेक्स्ट बदलने के लिए लूप] (http://stackoverflow.com/questions/6325202/objective -सी-लूप-टू-चेंज-लेबल-टेक्स्ट) और [कॉलिंग नींद और टेक्स्ट फ़ील्ड को अपडेट नहीं कर रहा है] (http://stackoverflow.com/questions/5834062/calling-sleep5-and-updating-text-field-not -working) –

+1

देखें: http://stackoverflow.com/questions/6325202 और http://stackoverflow.com/questions/5829977 –

उत्तर

14

आप रन पाश बताकर यूआई अद्यतन कर सकते हैं इस तरह चलाने के लिए: मेरे पहले टिप्पणी से

for (NSInteger i = 0; i < 10; i++) { 
    [label setText:...]; 
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]]; 
} 
+1

हां, रन लूप पहले से चल रहा है, लेकिन इसे ऊपर दिए गए उदाहरण में चलाने के लिए कहने से यूआई अपडेट सहित इनपुट स्रोतों को संसाधित किया जाएगा। –

+0

वास्तव में बहुत निफ्टी चाल है। मैं मदद नहीं कर सकता लेकिन महसूस करता हूं कि रनलोप में हेरफेर करने में कुछ खतरा है, लेकिन यह वास्तव में काम कर रहा है, धन्यवाद। – johnbakers

+2

ध्यान दें कि इसमें सभी प्रकार के विचित्र दुष्प्रभाव हो सकते हैं। जब आप 'रनमोड: पहले दिनांक:' कहते हैं, तो आपके लूप के बीच में सभी प्रकार की चीजें हो सकती हैं। टाइमर आग लग सकता है; वेबकिट सभी प्रकार की पागलपन कर सकता है; देरी चयनकर्ता आग कर सकते हैं। यह एक बहुत ही खतरनाक चाल है। कभी-कभी उपयोगी, कभी-कभी आवश्यक (विशेष रूप से मैक पर), लेकिन एक सामान्य उद्देश्य उपकरण नहीं। –

-2

कोशिश

[yourLabel setNeedsDisplay]; 
+3

काफी नहीं। '-setNeedsDisplay' शेड्यूल को बाद के रन लूप में अपडेट करने के लिए शेड्यूल करता है-यह तुरंत पुनः ड्रॉ नहीं करता है। –

7

:

नोट यह है कि (runMode:beforeDate:) सभी प्रकार के विचित्र दुष्प्रभाव हो सकते हैं। जब आप runMode को कॉल करते हैं: पहले दिनांक :, आपके लूप के बीच में सभी प्रकार की चीजें हो सकती हैं। टाइमर आग लग सकता है; वेबकिट सभी प्रकार की पागलपन कर सकता है; देरी चयनकर्ता आग कर सकते हैं। यह एक बहुत ही खतरनाक चाल है। कभी-कभी उपयोगी, कभी-कभी आवश्यक (विशेष रूप से मैक पर), लेकिन एक सामान्य उद्देश्य उपकरण नहीं।

बेहतर समाधान मुख्य प्रेषण कतार पर आपके अद्यतन शेड्यूल करने के लिए है:

for (NSInteger i = 0; i < 10; i++) { 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, i * NSEC_PER_SEC), 
        dispatch_get_main_queue(), ^{ 
     [self.label setText:[NSString stringWithFormat:@"%d", i]]; 
    }); 
    } 

यह कार्यक्रम 10 अपडेट 1 सेकंड के अलावा। इसे मुख्य रन लूप पर अवरुद्ध करने के तरीके के बिना सभी प्रकार की अन्य आवश्यकताओं के लिए अनुकूलित किया जा सकता है।

+0

यह पूरी तरह से काम करता है। बहुत धन्यवाद। आप एक जीवन बचतकर्ता हैं !! – user1752054

+0

भयानक उत्तर, धन्यवाद – channi

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