显示活动指示器的动画时,按下按钮
我有一个名为“同步”按钮。当窃听/把它压将数据发送到网络服务器和服务器(有什么需要一段时间,并冻结GUI /按钮)检索答案让我怎么添加一个“请等待”和活动的指标,直到从服务器中的数据/答案到达并且文本/指示符被删除并由来自服务器的回答取代?显示活动指示器的动画时,按下按钮
此代码冻结我的应用程序:
- (IBAction) syncButtonTapped
{
[syncButton setEnabled:NO];
//resultText.text= @"Bitte warten ...";
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex: 0];
NSString *docFile = [docDir stringByAppendingPathComponent: @"deck.txt"];
NSString *post = [NSString stringWithContentsOfFile:docFile encoding:NSUTF8StringEncoding error:nil];
NSString *post2 = [post stringByReplacingOccurrencesOfString:@"\n" withString:@","];
NSString *post3 = [post2 stringByReplacingOccurrencesOfString:@"\r" withString:@""];
NSString *post4 = [NSString stringWithFormat:@"{\"results\":[%@]}",post3];
NSString *urlString = [NSString stringWithFormat:@"http://storecheck.cortona.de/fetchresults.php?results=%@",[post4 stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding]];
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"GET"];
NSString *data4 = @"";
[data4 writeToFile: docFile atomically: NO encoding: NSUTF8StringEncoding error:nil];
//send request & get response
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
}
我是一台Mac Mini的工作与iOS 10.6.7
你同步请求阻塞UI线程,这就是为什么活动的指标将无法启动。由于多种原因,您应该异步使用NSURLConnection,这就是其中之一。
相反的:
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
务必:
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[conn start];
[conn release];
然后让returnData实例变量和实施NSURLConnectionDeletgate方法:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
returnData = [[NSMutableData alloc] init];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[returnData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
// do whatever you need with your string and stop activity indicator
[returnData release];
}
和我怎么做? –
我已将代码添加到我的答案中。被检测的 –
; token before:token on: - (void)connection:(NSURLConnection *)连接didReceiveResponse:(NSURLResponse *)响应 –
//Right before the request is made
UIActivityIndicatorView* indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[indicatorView setFrame:CGRectMake(0, 0, 16, 16)];
[indicatorView setHidesWhenStopped:YES];
[indicatorView startAnimating];
[self.view addSubview:indicatorView];
// Create your request (synchronously or asynchronously)
...
// When request is done
[indicatorView stopAnimating];
[indicatorView release];
添加在UIAleartView活动指标会有所帮助。 结帐这个...
UIAlertView *waitAlert = [[[UIAlertView alloc] initWithTitle:@"Please Wait...." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil] autorelease];
[waitAlert show];
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
// Adjust the indicator so it is up a few pixels from the bottom of the alert
indicator.center = CGPointMake(waitAlert.bounds.size.width/2, waitAlert.bounds.size.height - 50);
[indicator startAnimating];
[waitAlert addSubview:indicator];
[indicator release];
编辑: 可能就是你的应用程序被阻塞的原因是这种方法
sendSynchronousRequest:(NSURLRequest *)request
以下是该方法的描述。
的同步负荷是建立在由类提供异步加载代码的顶部。调用线程在异步加载系统对专门为此加载请求生成的线程执行URL加载时被阻塞。为了执行同步加载,在调用线程中不需要特殊的线程或运行循环配置。
如果你不想让你的应用程序阻止再从其他线程调用此。请阅读以下内容。
重要提示:由于此调用有可能需要几分钟失败(使用iOS的蜂窝网络特别是当),你永远不应该叫从GUI应用程序的主线程此功能。
请参考NSURLConnection的等级参考。上述两个块均取自该块。
使用未声明的标识符'waitAlert'? –
在你的代码中声明UIAleartView * waitAlert你只是没有我正在使用的变量。所以在代码中声明它们。 – Mohammad
that worked,tahnks,但冻结的问题没有解决=( –
创建:
spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[spinner setCenter:CGPointMake(kScreenWidth/2.0, kScreenHeight/2.0)]; // I do this because I'm in landscape mode
[self.view addSubview:spinner]; // spinner is not visible until started
开始:
[spinner startAnimating];
停止:
[spinner stopAnimating];
当你最终完成时,从视图中删除微调并释放。
对于synchroneous使用:(不好的形式,但工作解决方案)
//Right before the request is made
UIActivityIndicatorView* indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[indicatorView setFrame:CGRectMake(0, 0, 16, 16)];
[indicatorView setHidesWhenStopped:YES];
[indicatorView startAnimating];
[self.view addSubview:indicatorView];
// Create your request (synchronously or asynchronously)
[self performSelector:@selector(myDoRequest:) withObject:self afterDelay:0.1];
//this gives time for the runloop to complete at least one screen draw..
...
-(void)myDoRequest:(id)sender {
// Create your request (synchronously or asynchronously)
...
// When request is done
[indicatorView stopAnimating];
[indicatorView release];
}
也使用未声明的标识符。 myDoRequest当我把它变成IBAction为 –
我还喜欢将黑色背景,0.5 alpha UIView放在一切之前,以使它们变暗并禁用任何与UI元素的用户交互。 – bdares
输入被禁用,所以不想这个,不需要这个,你的意思是 –
http://stackoverflow.com/questions/593234/how-to-use-activity-indicator-view-on-iphone – PJR