2

私はこの問題で壁に頭をぶつけていて、助けが必要です。バックグラウンドでデータを読み込んでいる間に UIActivityIndi​​cator を表示しようとしています。これが関連しているかどうかはわかりませんが、テーブルビューを読み込んでいます。インジケーターは表示されますが、回転しません...画面に触れない限り、またはテキストメッセージを受信した場合のように、読み込み中に何かが発生しない限り. コードは次のとおりです。

UIActivityIndicatorView  *av = [[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite] autorelease];
av.frame=CGRectMake(145, 160, 25, 25);
av.tag  = 1;
[self.mTableView addSubview:av];
[av startAnimating];
[self performSelectorInBackground:@selector(load) withObject:nil];

私もこれを試しました:

UIActivityIndicatorView  *av = [[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite] autorelease];
av.frame=CGRectMake(145, 160, 25, 25);
av.tag  = 1;
[self.view addSubview:av];
[av startAnimating];
[self performSelectorInBackground:@selector(load) withObject:nil];

最後の行をコメントアウトして試してみました-したがって、バックグラウンドスレッドを実行していません。viewDidLoadメソッドとメソッドで両方のバージョンのコードを試しましたviewDidAppear

何か案は?

編集これが私のロード方法です

- (void)load {

NSString *post = [NSString stringWithFormat:@"id[]=%@", [ids objectAtIndex:0]];

for(int i = 1; i < ids.count; i++){
    post = [NSString stringWithFormat:@"%@&id[]=%@", post, [ids objectAtIndex:i]];
}


NSURL *url=[NSURL URLWithString:@"http://myurl/instructions"];

NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

/* when we user https, we need to allow any HTTPS cerificates, so add the one line code,to tell teh NSURLRequest to accept any https certificate, i'm not sure about the security aspects
 */

//[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[url host]];

NSError *error;
NSURLResponse *response;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

NSString *data=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];

[self parseData:data];

[spinner stopAnimating];

}
4

4 に答える 4

2

UIActivityIndicatorアニメーションを停止している場所と表示中に何が起こっているかを確認するのに十分なコードが含まれていませんでしたが、問題はほぼ確実に次のいずれかです。

1)コードが何らかの非同期メソッドを待機することを期待しているため、アクティビティインジケーターが時期尚早に停止します。

また

2) 「バックグラウンド」タスクと のUIActivityIndicator両方が同じスレッドで実行されており、アクティビティ インジケーターがアニメーション化するのに十分な時間が得られないポイントまで、「バックグラウンド」タスクがスレッドを独占しています。

UIActivityIndicatorこの投稿では、を独自のスレッドにプッシュする方法の例を示します。

アクティビティ インジケーターが回転しない

于 2012-04-09T20:45:44.593 に答える
1

UI の読み込みに時間がかかり、アニメーションをすぐに開始できません。viewDidLoad メソッドの NSTimer で起動することで、問題は解決しました。

timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(spin) userInfo:nil repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:UITrackingRunLoopMode];

およびスキャン方法:

spinner = [[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite] autorelease];
spinner.center = self.view.center;
spinner.hidesWhenStopped = YES;
[spinner startAnimating];
[self.view addSubview:spinner];
if ([spinner isAnimating]) NSLog(@"animating");
else NSLog(@"not animating");

[self performSelectorInBackground:@selector(load) withObject:nil];

うまくいけば、これが役に立ちます。

于 2012-04-10T18:59:04.653 に答える
0

アクティビティインジケーターとは関係ありませんが、loadメソッドはpost変数をループで書き換えます。連結するつもりだと思います:

post = [post stringByAppendingFormat: ...]

それ以外の場合、Webサービスには最後のパラメーターのみが表示されます。

また、スピナーをアニメーション化すると、次の問題は、stopAnimatingがメインスレッドから呼び出されているために停止しないことです。

于 2012-04-09T22:20:53.023 に答える
0

アクティビティ インジケーターを追加する場所は明確ではありませんが、メイン スレッド上にない場合、それに対する UI 呼び出しが機能しない可能性があります。私は通常、アクティビティモニターを開始および停止するための別のルーチンを設定しているので、それらを実行できperformSelectorInMainThread:ます。

于 2012-04-09T21:27:38.727 に答える