用户界面命令在IBAction中跳过

这是我的代码:

-(IBAction)saveDownloadedImage { NSLog(@"Test"); EXECUTED indicatorView.hidden = NO; NOT EXECUTED [indicatorView startAnimating]; NOT EXECUTED [statusLabel setText:@"WHY?"]; NOT EXECUTED [currentPicture setImage:[imageView image]]; EXECUTED ImageFileManager *fileManager = [[ImageFileManager alloc] init]; EXECUTED [fileManager saveImageToDisk:currentPicture]; EXECUTED indicatorView.hidden = YES; [statusLabel setText:@"Image saved successfully."]; EXECUTED saveButton.enabled = NO; EXECUTED 

}

节约的时间大约需要5秒钟。 所以在用户界面中看到这个指标是很正常的。 但没有任何反应! 任何想法?

一切都被执行。 你的问题是saveImageToDisk调用是同步的,你从UI线程调用它。 当你阻塞UI线程时,什么都不会重新绘制。 指示器被显示,但是直到IBAction返回时它才能被拖到屏幕上。

您必须asynchronous调用保存方法。
阻塞UI线程从来不是一个好主意。

编辑:请参阅以下问题的答案以获得正确的解决scheme: 在ios中asynchronous调用数据库

编辑2:可能的解决scheme之一(未testing)

 -(IBAction)saveDownloadedImage { indicatorView.hidden = NO; //Note you can use hidesWhenStopped property for this [indicatorView startAnimating]; [statusLabel setText:@"BECAUSE..."]; [currentPicture setImage:[imageView image]]; [NSThread detachNewThreadSelector:@selector(save) toTarget:self withObject:nil] } - (void)save { @autoreleasepool { ImageFileManager *fileManager = [[ImageFileManager alloc] init]; [fileManager saveImageToDisk:currentPicture]; [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO]; } } - (void)updateUI { indicatorView.hidden = YES; [statusLabel setText:@"Image saved successfully."]; saveButton.enabled = NO; } 

你确定吗?

1)indicatorView和statusLabel不为空,并且

2)indicatorView和statusLabel作为subview添加到self.view?

在我的知觉你正在开始活动指标主线程。

而是在主线程上显示指标

你应该在下面的独立线程上调用Indicator。

 -(IBAction)saveDownloadedImage { NSLog(@"Test"); EXECUTED commented below code //indicatorView.hidden = NO; NOT EXECUTED // [indicatorView startAnimating]; NOT EXECUTED //instead of main thread create new Thread as Below [NSThread detachNewThreadSelector:@selector(showloader) toTarget:self withObject:nil]; [statusLabel setText:@"WHY?"]; NOT EXECUTED [currentPicture setImage:[imageView image]]; EXECUTED ImageFileManager *fileManager = [[ImageFileManager alloc] init]; EXECUTED [fileManager saveImageToDisk:currentPicture]; EXECUTED [statusLabel setText:@"Image saved successfully."]; EXECUTED saveButton.enabled = NO; [indicatorView stopAnimating:YES]; indicatorView.hidden = YES; } //Custome method For shoing the Indicator. -(void)showloader{ //call below method here indicatorView object created already. [indicatorView startAnimating] } It'll definitely work 

你需要像这样向发件人声明你的方法

 -(IBAction)saveDownloadedImage:(id)sender