5

私はiOS5でUIProgressViewを使い始めましたが、実際にはうまくいきませんでした。ビューの更新に問題があります。進捗状況を更新するたびに、一連の順次アクションを実行しました。問題は、進行状況ビューが少しずつ更新されるのではなく、すべてが終了した後にのみ更新されることです。これは次のようになります。

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

スタックオーバーフローを閲覧していると、次のような投稿が見つかりました-iOS 5以降、setProgressはUIProgressViewを更新していません。これを機能させるには、別のスレッドを実行する必要があります。

これを明確にしたいと思いますが、UIProgressViewが正しく機能するために本当に別のスレッドが必要ですか?

4

3 に答える 3

18

はい、進行状況ビューの全体的な目的はスレッド化です。

メインスレッドでそのループを実行している場合は、UIをブロックしています。UIをブロックすると、ユーザーは対話でき、UIは更新できません。バックグラウンドスレッドですべての手間のかかる作業を行い、メインスレッドのUIを更新する必要があります。

ここに少しサンプルがあります

- (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];
}
于 2012-06-27T12:57:00.813 に答える
2

ファイルUIProgressViewで定義:.h

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++;

}
于 2013-04-29T12:17:36.340 に答える
1

私も同様の問題を抱えていました。setProgressを実行し、setNeedsDisplayなどを試しましたが、UIProgressViewは更新されませんでした。

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

setProgressの部分で進行する前に(int)を持っていました。intを使用してsetProgressを呼び出すと、UISliderのように更新されません。0から1までのfloat値でのみ呼び出す必要があります。

于 2016-10-11T18:01:11.830 に答える