向UIView添加ActivityIndi​​cator

时间:2012-11-28 11:44:04

标签: iphone xcode uiactivityindicatorview

我需要向UIView添加activityIndicator。我有一个按钮,当点击该按钮时,它必须开始动画。实际上,当单击按钮时,从休息服务接收一些数据并完成解析,然后填入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

我怎样才能让它发挥作用?

7 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

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

self.activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 20.0f, 20.0f)]; 

答案 2 :(得分:0)

可能这是因为您正在MAIN线程上进行webservice调用并同时更新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];
}

答案 3 :(得分: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];

答案 4 :(得分:0)

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

see this

答案 5 :(得分:0)

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

答案 6 :(得分: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 

}