这是我的代码:
-(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 秒。所以在 UI 中看到指示器是正常的。但是没有任何反应!有什么想法吗?
最佳答案
一切都已执行。您的问题是 saveImageToDisk
调用是同步的,您是从 UI 线程调用它的。当您阻塞 UI 线程时,不会重绘任何内容。指示器已显示,但在 IBAction
返回之前无法将其绘制到屏幕上,此时它将再次隐藏。
必须异步调用保存方法。
阻塞 UI 线程从来都不是一个好主意。
编辑:请参阅以下问题的答案以获得正确的解决方案:asynchronous calls to database in ios
Edit2:可能的解决方案之一(未测试)
-(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;
}
关于iphone - IBAction 中跳过的用户界面命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9395361/