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];

并尝试注释掉最后一行 - 所以没有运行后台线程。我已经在我的viewDidLoadviewDidAppear方法中尝试了这两个版本的代码。

有任何想法吗?

编辑这是我的加载方法

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

目前尚不清楚您在哪里添加活动指示器,但如果它不在主线程上,那么 UI 调用它可能不起作用。我通常会设置一个单独的例程来启动和停止我的活动监视器,这样我就可以performSelectorInMainThread:了。

于 2012-04-09T21:27:38.727 回答
0

与活动指示器无关,但您的加载方法会在循环中重写 post 变量。我认为您打算连接:

post = [post stringByAppendingFormat: ...]

否则,您的 Web 服务将只看到最后一个参数。

此外,一旦你让你的微调器动画,你将遇到的下一个问题是它不会停止,因为 stopAnimating 正在被主线程调用。

于 2012-04-09T22:20:53.023 回答