我需要向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
。
我怎样才能让它发挥作用?
答案 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)
您应该将activityIndicator定义为属性,在您的代码中将其作为局部变量。
将其定义为属性后,将分配行更改为:
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挂起
答案 5 :(得分:0)
您已在viewDidLoad方法中声明了UIActivityIndicatorView * activityIndicator,因此它只是对此函数可见的本地对象,您需要在头文件或.m中的类类别中声明它。当您在.h中声明activityIndicator实例时,您将能够在您的类中访问它。您可以将其作为属性或仅在.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
}