2012-04-15 8 views
0

いくつかの時間がかかるいくつかのUI要素をインスタンス化している間、プログレスバーを更新したいと思います。私は最初にviewLoadメソッド中に私のビューを作成し、そこに進捗バーを追加します。 viewDidAppearメソッドで私のビューが表示されたら、私はいくつかのuikitオブジェクトのインスタンスを作成していますが、私は平均時間内にプログレスバーを更新したいと思います。どのように進むべきかわからないのは、メインスレッドですべてがUi要素として発生するはずだからです。ここでタイムコンシューマUI要素のインスタンス化中にプログレスバーを更新するにはどうすればよいですか?

は、私のコードの一部です:上記のコードで

-(void) viewDidAppear:(BOOL)animated 
{ 
    // precompute the source and destination view screenshots for the custom segue 
    self.sourceScreenshotView = [[UIImageView alloc] initWithImage:[self.view pw_imageSnapshot]]; 

    [self.progressBar setProgress:.3]; 


    SCLViewController *rvc = [[SCLViewController alloc] init]; 
    UIView *destinationView = rvc.view; 
    destinationView.frame = CGRectMake(0, 0, kWidthLandscape, kHeightLandscape); 


    self.destinationScreenshotView = [[UIImageView alloc] initWithImage:[destinationView pw_imageSnapshot]]; 

    [self.progressBar setProgress:.5]; 

} 

私は後でそれらを使用するビューの2枚のスクリーンショットを作成する必要があります。問題は、進行状況を進行状況バーに設定するときに、最後の更新(.5)しか表示されないということです。このアップデートを行う適切な方法は何ですか?

答えて

0

重いビューをインスタンス化するためにperformSelectorInBackground:withObject:メソッドを使用できます。そのメソッド(ビューをインスタンス化するメソッド)は、メインスレッドでプログレスバーの進捗状況を設定する必要があります。

だからあなたのコードは次のようになります:

- (void)viewDidAppear:(BOOL)animated 
{ 
    [self performSelectorInBackground:@selector(instantiateHeavyViews) withObject:nil]; 
} 

- (void)instantiateHeavyViews 
{ 
    self.sourceScreenshotView = [[UIImageView alloc] initWithImage:[self.view pw_imageSnapshot]]; 
    [self performSelectorOnMainThread:@selector(updateMyProgressView:) withObject:[NSNumber numberWithFloat:0.3f] waitUntilDone:YES]; 

    SCLViewController *rvc = [[SCLViewController alloc] init]; 
    UIView *destinationView = rvc.view; 
    destinationView.frame = CGRectMake(0, 0, kWidthLandscape, kHeightLandscape); 

    self.destinationScreenshotView = [[UIImageView alloc] initWithImage:[destinationView pw_imageSnapshot]]; 

    [self performSelectorOnMainThread:@selector(updateMyProgressView:) withObject:[NSNumber numberWithFloat:0.5f] waitUntilDone:YES]; 
} 

- (void)updateMyProgressView:(NSNumber *)progress 
{ 
    [self.progressBar setProgress:[progress floatValue]]; 
} 

編集を:もちろん、それはあなたのプログレスバーをアニメーション化しません(それはあなたが望んでいる場合、私は知りません)。ビューが作成されている間にそれを移動したい場合は、デリゲートを使用して進捗状況を通知する必要があります。これは少し難しくなります。これにより、デリゲートに通知が出されるたびにプログレスバーを更新することができます。

+0

これは動作します - ありがとう!だからそれはOKですいくつかのUIVIバックグラウンドスレッドのインスタンス化ですか?私はuikitオブジェクトのすべての操作は、メインスレッドでのみ行う必要があると思った。また、各インスタンシエーションの後に設定したものに到達するまで進捗状況をスムーズに更新する方法についてもう少し詳しく説明できますか? – tiguero

+0

はい、バックグラウンドスレッドでビューをインスタンス化できます。メインスレッドで行う必要があることは、再描画(サブビューの追加やプロパティの変更など)を意味するすべてのことです。 スムーズな進歩についてお話ししたことは、まあ、プログレスバーを更新するためにあなたがどの瞬間にいるのかをあなたに知らせるデザインが必要です。今は、初期化がいつ開始され、いつ終了するかを知っているだけです。この初期化が一連の既知の手順である場合、その手順の間にコードを追加して、誰か(デリゲート)に進行状況バーを更新するように指示できます。 –

関連する問題