0

我第一次在 iPhone 应用程序中使用两个线程,但遇到了问题。在这个原型中,我有一个加载本地网页的视图控制器。我希望在页面加载完成之前显示一个活动指示器。使用下面的代码,活动指示器启动,页面加载正确,但活动指示器没有停止或隐藏。看起来从来没有调用过“加载”函数。

我究竟做错了什么?

- (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

您正在使用 webview,它已经提供了一种机制来知道加载何时完成,并且已经异步加载数据 - 确实不需要使用自定义线程。

将您的对象注册为 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 回答