9

iOS 5 が出てから、プログレス バーに少し問題があります。以下のコードは iOS 5 より前は問題なく動作していましたが、iOS 5 では進行状況バーにループ内で設定された新しい進行状況が表示されなくなりました。

コードは次のように動作すると予想されます。

  1. プログレスバーを作成する(作品)
  2. 新しいバックグラウンド プロセスの場合: 初期進行状況を 0.25 に設定します (動作します)。
  3. 同じバックグラウンド プロセスで: ループを通過しながら進行状況を更新します (iOS 4 で機能)

バー初期化のコードは次のとおりです。

// 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 のリリースで、それを壊す可能性のある変更はありましたか?

4

2 に答える 2

18

iOS 5 の切り替え以来、このような質問をたくさん見てきましたが、なぜ iOS 5 だけに問題があるのか​​ わかりません。

コードで[progressBar setProgress: [counterPercentage floatValue]];は、バックグラウンド スレッドから呼び出します。これは UI 呼び出しであり、バックグラウンド スレッドから実行しないでください。また、 は自分自身を表示する方法を知っているため、setNeedsDisplayを更新する必要はありません。iOS 5 では、UI を更新するための要件が​​より厳しくなっているようですが、とにかくベスト プラクティスとは何かという点までです。progressBarUIProgressView

私の目には、これはブロックの完璧な使い方のように見えます。ブロックを使用すると、for ループは次のように記述できます。

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
}
于 2012-01-10T13:51:48.077 に答える
2

それは iOS 5 で動作し、最も簡単な方法は次のとおりです。

.h ファイル:

IBOutlet UIProgressView *WhateverYouWantToCallIt;

.m ファイル:

[WhateverYouWantToCallIt setProgress:(float) 0.3];

そして、0.3 と書かれているところには、好きな値を入れることができます (0 から 1 の範囲内)。

于 2012-11-01T11:00:38.503 に答える