3

背景に Default.png を表示し、前に UIProgressBar を表示する SplashView を作成しようとしました。しかし、スプラッシュ画面が更新されていません...

ビューコントローラー内で、最初に初期化のステップ数をパラメーターとしてスプラッシュビューをロードし、次に NSTimer を介して 2 番目のスレッドを開始し、初期化ステップごとに SplashView に新しい進行状況の値を表示するように指示します。

理論的にはすべて問題ないように見えますが、このアプリを実行すると進行状況バーが更新されません (スプラッシュ スクリーンのメソッドが値を受け取り、ログで確認できます)。usleep(10000); も追加しようとしました。その間にビューの更新に少し時間を割き、プログレス バーを使用する代わりに、ビューに直接描画して [self setNeedsDisplay] を呼び出しました。しかし、すべてがうまくいきませんでした:/

私は何を間違っていますか?

ご協力いただきありがとうございます!

トム

ここにいくつかのコードがあります:

スプラッシュスクリーン:
- (id)initWithFrame:(CGRect)frame withStepCount:(int)stepCount {
    if (self = [super initWithFrame:frame]) {
        // 初期化コード

        background = [[UIImageView alloc] initWithFrame: [自己境界]];
        [background setImage: [UIImage imageWithContentsOfFile: [NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] resourcePath], @"Default.png"]]];
        [自己 addSubview: 背景];

        progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar];
        [progressView setFrame:CGRectMake(60.0f, 222.0f, 200.0f, 20.0f)];
        [progressView setProgress: 0.0f];

        stepValue = 1.0f / (フロート)stepCount;

        [self addSubview:progressView];
    }
    自分自身を返します。
}

- (ボイド)ティック {
    値 += stepValue;
    [progressView setProgress: 値];
}



ビューコントローラー:

- (id)initWithNibName:(NSString *)nibNameOrNil バンドル:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {

        SplashView = [[SplashView alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 320.0f, 480.0f) withStepCount:9];
        [自己 setView: スプラッシュ ビュー];

        NSTimer* delayTimer;
        delayTimer = [NSTimer scheduleTimerWithTimeInterval:0.05 target:self selector:@selector(finishInitialization) userInfo:nil repeats:NO];
    }
    自分自身を返します。
}

- (無効)finishInitialization {
    // 割り当て、データベースのオープン、ビューの作成、重い処理などを行います...
    [splashView ティック]; // これにより進行状況バーが更新されます...

    // 割り当て、データベースのオープン、ビューの作成、重い処理などを行います...
    [splashView ティック]; // これにより進行状況バーが更新されます...

    // init done... 正しいビューを設定し、SplashView を解放します
}
4

4 に答える 4

5

別の回答で述べたように、アプリが起動されると、限られた時間の間、 Default.png が表示され、それを制御することはできません。ただし、AppDelegate で同じ Default.png を表示する新しいビューを作成すると、元の Default.png からプログレス バーを追加できるビューへのシームレスな遷移を作成できます。

ここで、ビューなどを作成し、ユーザーにフィードバックを提供するためにプログレス バーを頻繁に更新しているとします。ここでの課題は、drawRect を実行するために呼び出されたときにのみビューが描画されることです。ただし、実行ループが drawRect を呼び出す必要があるビューを特定する機会を得ることなく、AppDelegate からいくつかの初期化コードからビューコントローラーの viewDidLoad に移行すると、ビューにステータス バーが表示されなくなります。

したがって、目的を達成するには、多くの初期化コードを他のスレッドまたはタイマー タスクにプッシュするなどして drawRect が確実に呼び出されるようにするか、後で drawRect を自分で呼び出して描画を強制することができます。コンテキストの設定など。

バックグラウンド タスクを使用する場合は、初期化コードがスレッドセーフであることを確認してください。

于 2009-09-09T04:36:58.247 に答える
3

Default.pngは単なるグラフィックであり、アプリケーションの起動中に表示される静止画像です。さらに進捗状況を表示したい場合は、applicationDidLaunchフェーズですべてを表示する必要があります。最初にモーダル「スプラッシュ画面」を表示し(ビューコントローラーを作成し、viewメインウィンドウのサブビューとして追加します)、必要な追加の読み込みが完了したら閉じます。

于 2009-09-09T03:59:18.593 に答える
1

私の知る限り、メイン スレッドは、GUI を安全に実行できる唯一のスレッドであり、そのイベント ループ (つまり、メイン アプリケーション スレッド) は、 を呼び出した後に実際の表示を行うスレッドです-setNeedsDisplay。読み込みを行う新しいスレッドを生成し、メイン スレッドの進行状況を更新します。

于 2009-09-09T04:56:37.613 に答える
1

また、別のスレッドで進行状況バーを更新する必要があります。多くのビジネスが行われている同じスレッドで GUI を更新することは (私の意見では、間違っている可能性があります) 悪い考えです。

于 2009-09-09T04:28:03.833 に答える