0

iPhoneアプリで初めて2つのスレッドを使用していますが、問題が発生しました。このプロトタイプには、ローカルWebページをロードするViewControllerがあります。ページの読み込みが完了するまでアクティビティインジケーターを表示したい。以下のコードを使用すると、アクティビティインジケーターが起動し、ページが正しく読み込まれますが、アクティビティインジケーターが停止または非表示になることはありません。「loading」関数が呼び出されるようには見えません。

私は何が間違っているのですか?

- (void)viewDidLoad {
 [self.view addSubview:activityIndicator];
 [activityIndicator startAnimating];
 [NSThread detachNewThreadSelector:@selector(getData) toTarget:self withObject:nil];
 [super viewDidLoad];
}
- (void)getData {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 [detailWebView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"page1" ofType:@"html"]isDirectory:NO]]];
 [NSTimer scheduledTimerWithTimeInterval: (1.0/2.0) target:self selector:@selector(loading) userInfo:nil repeats:YES];
 [pool release];
}
- (void)loading {
 if(!detailWebView.loading){
 [activityIndicator stopAnimating];
 [activityIndicator removeFromSuperview];
 }
4

4 に答える 4

2

独自のスレッドを作成せずにこれを行う簡単な方法があります。

- (void)viewDidLoad {
    [self.view addSubview:activityIndicator];
    [activityIndicator startAnimating];
    [detailWebView setDelegate:self];
    [detailWebView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"page1" ofType:@"html"]isDirectory:NO]]];
    [super viewDidLoad];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [activityIndicator stopAnimating];
}
于 2010-08-18T15:07:44.213 に答える
1

Webviewデリゲートメソッドでアクティビティインジケーターを停止することをお勧めします。

-(void)webViewDidFinishLoad:(UIWebView*)webView
于 2010-08-18T15:04:51.560 に答える
0

loading呼び出されるかどうかにデバッグ出力を追加しましたか?コードは確かにそのように見えます。0.5秒後に呼び出されるはずですが、detailWebViewはまだロードされていると思います。

また、GUIはメインスレッドで実行する必要があるため、次のことを行う必要があります。

- (void)loading {
  if(!detailWebView.loading){
    [activityIndicator performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:YES];
    [activityIndicator performSelectorOnMainThread:@selector(removeFromSuperView) withObject:nil waitUntilDone:YES];
  }
}
于 2010-08-18T15:07:13.630 に答える
0

Webビューを使用しています。これは、ロードがいつ終了したかを知るメカニズムをすでに提供しており、データを非同期でロードしています。カスタムスレッドを使用する必要はありません。

オブジェクトをUIWebViewのデリゲートとして登録します。UIWebViewでloadRequestを呼び出し、進行状況インジケーターのアニメーション化を開始します。次の場所で進行状況インジケーターのアニメーション化を停止します。

-(void)webViewDidFinishLoad:(UIWebView*)webView

このメソッドはUIWebViewDelegateプロトコルによって定義されています-オブジェクトがこのプロトコルを実装していることを確認してください。このメソッドを実装します。

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [activityIndicator stopAnimating];
}

http://developer.apple.com/iphone/library/documentation/uikit/reference/UIWebViewDelegate_Protocol/Reference/Reference.html

于 2010-08-18T15:11:34.353 に答える