我是第一次在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];
}
答案 0 :(得分: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];
}
答案 1 :(得分:1)
您可以在webview委托方法中停止活动指示器:
-(void)webViewDidFinishLoad:(UIWebView*)webView
答案 2 :(得分: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];
}
}
答案 3 :(得分:0)
您正在使用webview,它已经提供了一种机制来了解负载何时完成,并且已经异步加载数据 - 实际上不需要使用自定义线程。
将您的对象注册为UIWebView的委托。在UIWebView上调用loadRequest并开始设置进度指示器的动画。停止在以下位置设置进度指示器的动画:
-(void)webViewDidFinishLoad:(UIWebView*)webView
此方法由UIWebViewDelegate协议定义 - 确保您的对象实现此协议。您实现此方法:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
[activityIndicator stopAnimating];
}