2010-08-20 99 views
0

苹果文档使这看起来很容易,但它不起作用。我的代码是:UIActivityIndi​​cator问题

UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 

[activity startAnimating]; 

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://www.myserver.com"]]; 

[request setPostValue:name forKey:@"key"]; 


[request startSynchronous]; 
    NSLog(@"%@",[request responseString]); 

[activity stopAnimating]; 
[activity release]; 

我没有UIBuilder设置任何东西,因为坦率地说,我不明白它是如何工作与UIActivityIndi​​cator。使用上面的代码构建和运行应用程序不会发送任何警告指示符,并且运行得很好,但我没有看到活动指示符。

回答

1

在完成方法调用之前,UI将不会更新(或者直到在运行循环中更精确地进行下一次迭代),所以这将在同一步骤中有效地添加和删除它。

您应该异步地处理您的请求以查看发生的事情,或者至少在主线程上独立安排不同的任务(添加活动,请求本身并将其删除)。但是阻止主线程是一个非常糟糕的主意,如果您的请求花费太长时间来响应(无论出于何种原因 - 易于使用Web服务),您的应用程序将完全被终止。

+0

我不太明白。我在发送请求之前开始动画 - 然后发送请求(我的实际请求比我显示的要大得多,但没有必要修复我的问题 - 然后我停止动画。我尝试添加[self.view addSubview:activity] startAnimating之后,并没有修复它 – startuprob 2010-08-20 17:22:06

+0

不需要。对UIKit所做的任何更改在运行循环的下一次迭代之前不会生效,它甚至不会在这些调用之间重新绘制屏幕上的单个像素 – Eiko 2010-08-20 17:55:56

2

@ Eiko的权利,你的用户界面将阻止等待你的同步Web请求完成,但还有另一个问题。你甚至没有将你的活动视图添加到你的主视图!

您需要给UIActivityIndicatorView *activity一个.frame的值,然后将它添加到视图层次中。因此:

activity.frame = CGRectMake(0,0,50,50); //that'll be top-left corner 
[self.view addSubview:activity]; 
[activity startAnimating]; 

现在,当您进行网络请求时,它会坐在那里不旋转,因为您正在主线程上执行该请求。我非常高兴你使用ASI,但你会以丑陋的方式去讨论它。

使您的UIViewController符合ASIHttpRequestDelegate协议。

Set request.delegate = self;

执行-requestFinished(ASIHttpRequest *)request来处理您得到的响应,并在THAT方法中隐藏您的活动视图。在这一点上,你可能会希望你已经将它命名为财产,或者至少是一个iVar,所以你稍后会处理它。

+0

这听起来很愚蠢,但我如何从不同的方法访问“活动”? – startuprob 2010-08-20 19:23:09

+0

您将其设置为综合属性,然后在实例化它时,将其分配给'self.activity'而不是' UIActivityIndi​​catorView *活动。 – 2010-08-20 19:38:25

0

尝试将UIActivityIndi​​catorView创建置于不同的线程中。

0
 UIView *acty_view=[[UIView alloc]initWithFrame:CGRectMake(130,220, 60, 60)]; 
     acty_view.backgroundColor=[UIColor blackColor]; 
     acty_view.alpha = 0.6; 
     acty_view.layer.cornerRadius = 10; 
     acty_view.layer.masksToBounds = YES; 
     activitidicator = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(15, 15, 30, 30)]; 
     [activitidicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhite]; 
     [activitidicator setColor:[UIColor whiteColor]]; 

     UILabel *lbl=[[UILabel alloc]initWithFrame:CGRectMake(8, 42, 100, 15)]; 
     [email protected]"Loading"; 
     [lbl setFont:[UIFont systemFontOfSize:10]]; 
     lbl.textColor = [UIColor whiteColor]; 
     // [lbl setFont:[UIFont fontWithName:@"Helvetica" size:13]]; 
     [acty_view addSubview:lbl]; 
     [acty_view addSubview:activitidicator]; 
     [self.view addSubview:acty_view]; 
     [activitidicator startAnimating]; 
     [self performSelector:@selector(CallWebserviceMethod) withObject:activitidicator afterDelay:0];` 

-(void)CallWebserviceMethod 
{ 
[self JsonResults]; 
[activitidicator stopAnimating]; 
} 
相关问题