0

我需要向activityIndicatorUIView 添加一个。我有一个按钮,当单击该按钮时,它必须开始制作动画。实际上,当单击按钮时,会从休息服务接收一些数据并完成解析,然后将其填充。UITableView但是活动指示器没有动画..

- (void)viewDidLoad
{
    [super viewDidLoad];

  UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] 
                                                  initWithFrame:CGRectMake(0.0f, 0.0f, 20.0f, 20.0f)];
    [activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleGray];

    [self.view addSubview:activityIndicator];
}
-(IBAction)switchtoGetProviders
{
   [activityIndicator startAnimating];
 NSURL *urlString= [NSString stringWithFormat:@"http://230.32.232.32/services/service.svc/Xml"];  
        NSMutableURLRequest *request=[[[NSMutableURLRequest alloc] init]autorelease];
..............//calling data from service url 

}

在接收到分配给 的全部数据后UITableView

我怎样才能让它工作?

4

7 回答 7

1

您不能在一个函数/方法中启动和停止活动指示器。

有两种方法可以做到这一点。

如果请求是异步的,那么您需要在单击按钮时启动活动指示器并在收到响应时停止。

但是如果请求是同步的,那么就不可能在一个函数中启动和停止活动。为此,您需要在按钮单击时启动动画,并为发送同步请求创建单独的方法,并使用 [self performSelector:] 方法调用该方法。最后你需要停止动画。

更新:

-(IBAction)switchtoGetProviders
{
   [activityIndicator startAnimating];
   [self performSelector:@selector(startRequest) withObject:nil afterDelay:0];
}
- (void)startRequest 
{
   NSURL *urlString= [NSString stringWithFormat:@"http://230.32.232.32/services/service.svc/Xml"];  
        NSMutableURLRequest *request=[[[NSMutableURLRequest alloc] init]autorelease];
..............//calling data from service url 

  [activityIndicator stopAnimating];
}
于 2012-11-28T11:57:53.283 回答
0

您应该将 activityIndi​​cator 定义为属性,在您的代码中将其作为局部变量。
将其定义为属性后,将赋值行更改为:

self.activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 20.0f, 20.0f)]; 
于 2012-11-28T11:48:33.873 回答
0

这可能是因为您在主线程上同时进行 Web 服务调用和更新 UI。您必须使用 GCD 或分离另一个线程来进行 Web 服务调用。

使用它来分离一个新线程

[NSThread detachNewThreadSelector:@selector(callWebserviceMethod:) toTarget:self withObject:nil];

在您的代码中

-(IBAction)switchtoGetProviders
{
    [activityIndicator startAnimating];
     [NSThread detachNewThreadSelector:@selector(callWebserviceMethod:) toTarget:self withObject:nil];
}

-(void)callWebserviceMethod
{

    NSURL *urlString= [NSString stringWithFormat:@"http://230.32.232.32/services/service.svc/Xml"];  
    NSMutableURLRequest *request=[[[NSMutableURLRequest alloc] init]autorelease];
}
于 2012-11-28T11:48:35.480 回答
0

只需在 .h 文件中添加这一行

UIActivityIndicatorView *spinningWheel;

并在viewWillAppear方法中添加此代码..

    spinningWheel = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(120, 200, 25.0, 25.0)];

    spinningWheel.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;///UIActivityIndicatorViewStyleGray also use this if background white
    [self.view addSubview:spinningWheel];


-(IBAction)switchtoGetProviders
{
   [spinningWheel startAnimating];
 NSURL *urlString= [NSString stringWithFormat:@"http://230.32.232.32/services/service.svc/Xml"];  
        NSMutableURLRequest *request=[[[NSMutableURLRequest alloc] init]autorelease];
..............//calling data from service url 

}

当你得到数据或响应时,像下面这样停止动画..

   [spinningWheel stopAnimating];
于 2012-11-28T11:48:48.163 回答
0

您需要在后台线程中从 Web 服务获取数据,因为在主线程上调用它会导致 UI 挂起

看到这个

于 2012-11-28T11:49:02.217 回答
0

您已在 viewDidLoad 方法中声明了 UIActivityIndi​​catorView *activityIndi​​cator,因此它是仅对该函数可见的本地对象,您需要在头文件或 .m 中的类类别中声明它。当您在 .h 中声明 activityIndi​​cator 实例时,您将能够在您的类中访问它。您可以将其作为属性,也可以只在 .h 中声明,然后在 viewDidLoad 方法中初始化而不重新声明。

于 2012-11-28T11:49:09.193 回答
0

只需这样做,在.h文件中声明它意味着可以轻松声明

。H

@interface yourViewController : UIViewController
{
    IBOutlet UIActivityIndicatorView *activityIndicator;
}  

.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    activityIndicator = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(143, 220, 37, 37)];
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
    activityIndicator.color = [UIColor blackColor];
    [self.view addSubview:activityIndicator];
}  


-(IBAction)switchtoGetProviders
{
   [activityIndicator startAnimating];

 NSURL *urlString= [NSString stringWithFormat:@"http://230.32.232.32/services/service.svc/Xml"];  
        NSMutableURLRequest *request=[[[NSMutableURLRequest alloc] init]autorelease];
..............//calling data from service url 

}
于 2012-11-28T11:49:33.507 回答