2012-06-27 21 views
5

मैंने आईओएस 5 में यूआईपी प्रोग्रेस व्यू के साथ खेलना शुरू कर दिया है, लेकिन वास्तव में इसके साथ भाग्य था। मुझे दृश्य अपडेट करने में परेशानी हो रही है। प्रगति अद्यतन करने के बाद, मैंने अनुक्रमिक कार्रवाइयों का सेट किया है। समस्या यह है कि प्रगति दृश्य को थोड़ा कम नहीं किया जाता है, लेकिन केवल समाप्त होने के बाद ही। यह कुछ इस तरह चला जाता है:UIProgressView अपडेट नहीं हो रहा है?

float cnt = 0.2; 
for (Photo *photo in [Photo photos]) { 
    [photos addObject:[photo createJSON]]; 
    [progressBar setProgress:cnt animated:YES]; 
    cnt += 0.2; 
} 

की तरह इन ढेर अतिप्रवाह ब्राउज़िंग, मैं पाया है पदों - setProgress is no longer updating UIProgressView since iOS 5, इस क्रम में जिसका अर्थ है काम करने के लिए, मैं एक अलग थ्रेड को चलाने के लिए की जरूरत है।

मैं इसे स्पष्ट करना चाहता हूं, क्या मुझे वास्तव में UIProgressView के लिए ठीक से काम करने के लिए अलग थ्रेड चाहिए?

उत्तर

18

हां प्रगति दृश्य का पूरा उद्देश्य थ्रेडिंग के लिए है।

यदि आप मुख्य थ्रेड पर उस लूप को चला रहे हैं तो आप यूआई को अवरुद्ध कर रहे हैं। यदि आप यूआई को अवरुद्ध करते हैं तो उपयोगकर्ता बातचीत कर सकते हैं और यूआई अपडेट नहीं हो सकता है। आपको पृष्ठभूमि थ्रेड पर सभी भारी उठाने चाहिए और मुख्य थ्रेड पर यूआई अपडेट करना चाहिए।

उसके बारे में यहां थोड़ा नमूना

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self performSelectorInBackground:@selector(backgroundProcess) withObject:nil]; 

} 

- (void)backgroundProcess 
{  
    for (int i = 0; i < 500; i++) { 
     // Do Work... 

     // Update UI 
     [self performSelectorOnMainThread:@selector(setLoaderProgress:) withObject:[NSNumber numberWithFloat:i/500.0] waitUntilDone:NO]; 
    } 
} 

- (void)setLoaderProgress:(NSNumber *)number 
{ 
    [progressView setProgress:number.floatValue animated:YES]; 
} 
2

.h फ़ाइल में UIProgressView परिभाषित करें:

IBOutlet UIProgressView *progress1; 

.m फ़ाइल में:

test=1.0; 
progress1.progress = 0.0; 
[self performSelectorOnMainThread:@selector(makeMyProgressBarMoving) withObject:nil waitUntilDone:NO]; 

- (void)makeMyProgressBarMoving { 
    NSLog(@"test %f",test); 
    float actual = [progress1 progress]; 
    NSLog(@"actual %f",actual); 

    if (progress1.progress >1.0){ 
     progress1.progress = 0.0; 
     test=0.0; 
    } 

    NSLog(@"progress1.progress  %f",progress1.progress); 
    lbl4.text=[NSString stringWithFormat:@" %i %%",(int)((progress1.progress) * 100) ] ; 
    progress1.progress = test/100.00;//actual + ((float)recievedData/(float)xpectedTotalSize); 
    [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(makeMyProgressBarMoving) userInfo:nil repeats:NO]; 
    test++; 

} 
1

मैं इसी तरह की समस्या थी। UIProgressView आदि को अद्यतन करने गया था नहीं, हालांकि मैं setProgress किया था और यहां तक ​​कि setNeedsDisplay की कोशिश की,

float progress = (float)currentPlaybackTime/(float)totalPlaybackTime; 
[self.progressView setProgress:progress animated:YES]; 

मैं setProgress भाग में प्रगति पहले था (int)। यदि आप int के साथ setProgress को कॉल करते हैं, तो यह UISlider की तरह अपडेट नहीं होगा। इसे केवल 0 से 1.

से फ्लोट मान के साथ कॉल करना चाहिए
संबंधित मुद्दे