2012-01-10 12 views
9

के बाद से UIProgressView अपडेट कर रहा है मैं एक प्रगति बार के साथ एक छोटे से परेशानी है के बाद से, iOS 5 बाहर आया था। नीचे दिया गया कोड आईओएस 5 से पहले ठीक काम कर रहा था लेकिन आईओएस 5 के साथ प्रगति पट्टी अब लूप के भीतर सेट की गई नई प्रगति को प्रदर्शित नहीं कर रही है।setProgress नहीं रह गया है iOS 5

कोड इस तरह काम करने के लिए आशा की जाती है: 0.25 (काम) की एक प्रारंभिक प्रगति

  • ही में सेट करें:

    1. प्रगति बार (काम)
    2. एक नया पृष्ठभूमि प्रक्रिया में बनाएं पृष्ठभूमि प्रक्रिया: प्रगति अद्यतन पाश के माध्यम से जा रहा है, जबकि (आईओएस 4 में काम किया)

    यहाँ बार init के लिए कोड है:

    // create a progress bar 
    UIProgressView *progressBar = [[UIProgressView alloc] initWithFrame:CGRectMake(coverSizeX*0.25, coverSizeY - 34.0, coverSizeX*0.5, 9.0)]; 
    progressBar.progress = 0.0; 
    progressBar.progressViewStyle = UIProgressViewStyleBar; 
    

    और एक अलग धागे में यह 0.25 से प्रगति के लिए एक प्रारंभिक बिंदु के सेट:

    // set an initial progress 
    [progressBar setProgress: 0.25]; 
    

    थोड़ी देर बाद यह एक पाश के भीतर प्रगति डाउनलोड प्रगति प्रदर्शित करने के लिए अद्यतन किया जाता है:

    // within a for-loop: 
    NSNumber *counterPercentage; 
    for (pageDownload = 1; pageDownload < pagesToDownload; pageDownload++) { 
        counterPercentage = [[NSNumber alloc] initWithFloat: (float)pageDownload/(float)((float)pagesToDownload)]; 
        [progressBar setProgress: [counterPercentage floatValue]]; 
        [progressBar performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES]; 
    } 
    

    ... लेकिन स्क्रीन पर प्रगति दिखाई नहीं दे रही है, प्रगति पट्टी सेट की गई प्रारंभिक 0.25 प्रगति पर फंस गई है।

    वहाँ थे iOS 5 रिलीज कि यह टूट किया जा सकता था के साथ किसी भी परिवर्तन?

  • उत्तर

    18

    मैं आईओएस 5 स्विच के बाद से इस तरह सवालों का एक बहुत देखा है, और मुझे यकीन है कि क्यों वहाँ केवल iOS 5 में एक समस्या है नहीं कर रहा हूँ लेकिन जिसका मुख्य कारण मुझे यकीन है कि क्यों वहाँ नहीं था नहीं कर रहा हूँ पहले एक समस्या है।

    अपने कोड में आप पृष्ठभूमि थ्रेड से [progressBar setProgress: [counterPercentage floatValue]]; पर कॉल करते हैं। यह एक यूआई कॉल है और पृष्ठभूमि थ्रेड से नहीं बनाया जाना चाहिए। इसके अलावा आप setNeedsDisplay पर कॉल करते हैं जो progressBar को अपडेट करने के लिए आवश्यक नहीं है क्योंकि UIProgressView जानता है कि खुद को कैसे प्रदर्शित किया जाए। ऐसा लगता है कि आईओएस 5 ने UI को अधिक कठोर अद्यतन करने की आवश्यकताएं की हैं, लेकिन केवल वैसे भी जो सर्वोत्तम प्रथाओं के लिए हैं।

    मेरी आंखों में यह ब्लॉक के लिए एकदम सही उपयोग की तरह दिखता है। ब्लॉक अपने पाश के लिए इस तरह से लिखा जा सकता है का उपयोग करना:

    for (pageDownload = 1; pageDownload < pagesToDownload; pageDownload++) { 
         // Other stuff in background 
        dispatch_async(dispatch_get_main_queue(), ^{ 
         progressBar.progress = ((float)pageDownload/(float)pagesToDownload); 
        }); 
         // Other stuff in backgroud 
    } 
    
    +1

    धन्यवाद, यह काम किया! इसके अलावा बस :-) – favo

    2

    यह iOS 5 में काम करते हैं और यह करने के लिए सबसे आसान तरीका होता है यहाँ है:

    ज फ़ाइल:

    IBOutlet UIProgressView *WhateverYouWantToCallIt; 
    

    । मीटर फ़ाइल:

    [WhateverYouWantToCallIt setProgress:(float) 0.3]; 
    

    और जहां यह 0.3 कहते हैं, आप रख सकते हैं आप जो भी मान चाहते (0 1 करने के लिए अंदर),

    +0

    एक काम समाधान प्रदान @ user1791131 यह आईओएस 5 में काम नहीं करता है मुख्य मुद्दा है कि वह मुख्य थ्रेड के अलावा किसी अन्य धागे से एक यूआई परिवर्तन कर रहा था की तुलना में थोड़ा अधिक समझा के लिए धन्यवाद। किसी भी धागे से बने यूआई में किए गए किसी भी बदलाव जो मुख्य धागा नहीं है, पोस्ट नहीं करेगा। – BigSauce

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