Iphone UIActivityIndicator问题

Iphone UIActivityIndicator问题,iphone,Iphone,苹果的文档让这看起来很简单,但它不起作用。我的代码是: UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; [activity startAnimating]; ASIFormDataRequest *request = [ASIFormDataRequest

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

 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中设置任何东西,因为坦率地说,我不知道它是如何与UIActivityIndicator一起工作的。使用我上面的代码构建和运行应用程序不会发出任何警告指示,运行良好,但我没有看到活动指示。

在完成方法调用之前,UI不会更新(或者更准确地说,直到运行循环中的下一次迭代),因此,这实际上是在同一步骤中添加和删除它


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

在完成方法调用之前,UI不会更新(或者更准确地说,直到运行循环中的下一次迭代),因此,这实际上是在同一步骤中添加和删除它


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

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

您需要给
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
来处理您得到的响应,并在该方法中隐藏活动视图。此时,您可能希望将其作为一个命名属性,或者至少是一个iVar,以便稍后对其进行处理。

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

您需要给
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
来处理您得到的响应,并在该方法中隐藏活动视图。此时,您可能希望将其作为命名属性,或者至少是iVar,以便稍后对其进行处理。

尝试将UIActivityIndicatorView创建放在不同的线程中。

尝试将UIActivityIndicatorView创建放在不同的线程中。

我真的不明白。我在发送请求之前启动动画-然后发送请求(我的实际请求比我显示的请求大得多,但这不是解决问题的必要条件-然后我停止动画。我尝试添加[self.view addSubview:activity]在启动动画之后,这并没有解决它。不。对UIKit的任何更改都将在运行循环的下一次迭代之前生效。在这些调用之间,它甚至不会在屏幕上重新绘制一个像素。我真的不明白。我在发送请求之前启动动画,然后发送请求(我的实际请求比我显示的请求大得多,但这不是解决问题的必要条件-然后我停止了动画制作。我尝试添加[self.view addSubview:activity]在启动动画之后,这并没有解决它。不。对UIKit的任何更改都将在运行循环的下一次迭代之前生效。在这些调用之间,它甚至不会在屏幕上重新绘制一个像素。这听起来很愚蠢,但我如何从其他方法访问“活动”?您将其设置为合成属性。然后当y实例化它时,您将其分配给
self.activity
,而不是
UIActivityIndicatorView*activity
。这听起来很愚蠢,但我如何从其他方法访问“activity”?您将其设置为合成属性。然后当您实例化它时,您将其分配给
self.activity
,而不是
UIActivityIndicatorView*活动
       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];
}