我有一个TableViewController
带有触发[NSURLConnection sendAsynchronousRequest...]
事件的按钮,并且还通过 performSegueWithIdentifier:sender: 加载模态序列,它针对一个小视图控制器。此覆盖视图控制器的目的是显示加载图形并在通过NSURLConnection
.
在 的完成块中NSURLConnection
,我调用一个方法来删除TableViewController
(它只是一个批处理列表)中的数据,然后调用dismissViewControllerAnimated:completion:
覆盖视图控制器。
除了解除覆盖视图控制器之外,一切正常,这会在调试器中引发警告,上面写着: “警告:在演示或解除正在进行时尝试从视图控制器解除!”
我找到了关于这个错误的各种问题和答案,特别是关于使用这些performSelector:object:withDelay
方法的问题,但到目前为止没有任何效果。
这特别烦人,因为我在应用程序的另一个区域使用了类似的过程,除了从选择 a 时调用了 dismissViewController UITableViewCell
,这工作正常......
我的代码的相关位如下所示:
#import "ViewBatch.h"
@interface ViewBatch ()
@property (strong, nonatomic) LoadingOverlayViewController *loadingOverlay;
@end
@implementation ViewBatch
@synthesize loadingOverlay;
....
- (IBAction)exportBatch:(id)sender
{
if ([productArray count] > 0) {
[self performSegueWithIdentifier:@"loadingSegue" sender:self];
[self processData];
}
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"loadingSegue"]) {
loadingOverlay = segue.destinationViewController;
}
}
- (void)processData
{
// Code to create a file and NSURLRequest...
// ....
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:urlRequest
queue:queue
completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error) {
if ([responseData length] > 0 && error == nil)
{
// Not used for this request yet...
}
else if ([responseData length] == 0 && error == nil)
{
// Success...
[self didSendData];
}
else if (error != nil)
{
// Connection error...
NSLog(@"Error: %@", error);
}
}];
}
- (void)didSendData
{
// Reset the batch...
[productArray removeAllObjects];
[self.tableView reloadData];
[loadingOverlay dismissViewControllerAnimated:YES completion:NULL];
}
加载视图控制器只是:
#import <UIKit/UIKit.h>
@interface LoadingOverlayViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *statusLabel;
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;
@end
....
....
#import "LoadingOverlayViewController.h"
@interface LoadingOverlayViewController ()
@end
@implementation LoadingOverlayViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self.activityIndicator startAnimating];
}
@end