UIActivityIndi​​cator问题

时间:2010-08-20 16:55:34

标签: iphone

苹果文档让这看起来很简单,但它不起作用。我的代码是:

 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是如何工作的。使用上面的代码构建和运行应用程序并不会发送任何警告指示并运行正常,但我没有看到活动指示器。

4 个答案:

答案 0 :(得分:2)

@ Eiko是正确的,你的UI将阻止等待你的同步网络请求完成,但还有另一个问题。您甚至没有将活动视图添加到主视图中!

您需要为UIActivityIndicatorView *activity提供.frame值,然后将其添加到视图层次结构中。正是如此:

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

现在,当您执行Web请求时,它将不会旋转,因为您正在主线程上执行该请求。我很高兴你使用的是ASI,但你会以丑陋的方式解决它。

使您的UIViewController符合ASIHttpRequestDelegate协议。

设置request.delegate = self;

实施-requestFinished(ASIHttpRequest *)request来处理您获得的响应,并在THAT方法中隐藏您的活动视图。你可能会希望在那一点上你已经将它命名为一个命名属性,或者至少是一个iVar,所以你以后可以使用它。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

尝试将UIActivityIndi​​catorView创建放在不同的线程中。

答案 3 :(得分: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)];
        lbl.text=@"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];
}