2011-01-15 7 views
0

私のUIActivityIndi​​catorViewは、私のアプリケーションのシミュレータや他の3.0デバイスで正常に動作していました。しかし、私はそれが新しいiPhone 4で回転(または表示)されていないことを知った。基本的には、ボタンがクリックされたときにアクティビティインジケータを表示し、ボタンクリックイベントが完了したら非表示にする必要がある。私は以下のアプローチを使用していました。このlinkからUIActivityIndi​​catorの表示に関するもう1つの質問

[NSThread detachNewThreadSelector: @selector(spinBegin) toTarget:self withObject:nil];

。前述のように、それは4. *を除いてすべてのアクティビティインジケータを正しく回転させます。これを回避するために、私はまた、(developer.apple.comから)のような別のアプローチの何かを追っ

` (IBAction)syncOnThreadAction:(ID)、送信者

{

[self willStartJob]; 



[self performSelectorInBackground: 

    @selector(inThreadStartDoJob:) 

    withObject:theJobToDo 

]; 

}

(ボイド)inThreadStartDoJob:(ID)theJobToDo

{

NSAutoreleasePool * pool; 

NSString *   status; 



pool = [[NSAutoreleasePool alloc] init]; 

assert(pool != nil); 



status = [... do long running job specified by theJobToDo ...] 

[self performSelectorOnMainThread: 

    @selector(didStopJobWithStatus:) 

    withObject:status 

    waitUntilDone:NO 

]; 



[pool drain]; 

}

`

これに伴う問題は、トップバーでの活動の指標に建てられ、acitivityVIewIndicatorは(少なくともシミュレータ上で)正しく回転するが、それが停止した後に表示される、ということでした(ここでは電池%などが表示されます)がまだ回転しています。

私は目的C.に新しいです。私は完全に私のアプリを終了しましたが、このばかげたことです。私は別のスレッドを開始せずにUIActivityViewを表示する方法がないことを認識しています。そして最後に、暴言を言うだけで、どうしてそんなに複雑にしなければならないのか分かりません。私は彼らがこの問題を抱えていることを知っていたので、自分のソリューションを派生させるのではなく、誰もが使えるサンプルコードを提供してみませんか?

最後に、誰でも私に指示またはサンプルコードを提供してください。とても感謝しております。私は今、数時間を探していて、実際に何かを見つけていません!

答えて

4

なぜ、別のスレッドでインジケータを開始/停止していますか? UIActivityIndi​​catorView に送信するすべてのメソッドは、メイン(UI)スレッドで送信する必要があります。

押されたボタンによって送信されたイベントは、自動的にメインスレッドで実行されます。

- (IBAction)buttonPressed:(id)sender { 
    // This runs on the main thread 
    [activityIndicator startAnimating]; 
    [self performSelectorInBackground:@selector(inThreadStartDoJob:) withObject:theJobToDo]; 
} 

- (void)inThreadStartDoJob:(id)theJobToDo { 
    // Set up autorelease pool 
    ... 
    // Run your long-running action 
    ... 
    // Stop the spinner. Since we're in a background thread, 
    // we need to push this to the UI Thread 
    [activityIndicator performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:YES]; 
} 

編集:(バッテリーです)トップバーでの活動の指標については、自動的に動作しないのは、あなたがプロセスを完了するために、バックグラウンドスレッドを使用している場合は、のような何かができますネットワーク活動に基づいて開始/停止する?

+0

あなたが言及しているコードの最後の行、 [activityIndi​​cator performSelectorOnMainThread:@selector(stopAnimating)withObject:nilをwaitUntilDone:YES]; あなたは[SELF performSelectorOnMainThread:@selector(stopAnimating)withObject:nil waitUntilDone:YES]を意味しましたか?もしそうなら、これはまさに私がやっていることで、トップバーのアクティビティインジケータを除いて動作するようです。私はそれがネットワーク活動に基づいていることを知らなかった、私は見てみましょう。 –

+0

私はこの回答に同意します。私は[UIApplication sharedApplication] .networkActivityIndi​​catorVisible = NO;を実行しました。 にはネットワークインジケータが表示されません。私はネットワーク活動を持っていますが、私がstopメソッドを呼び出すまでにはすべて完了しています。何が起こっているのかは分かりません。 –

関連する問題