我有两个UITableViewControllers
A 和 B,当我单击 A 中的表格视图单元格时,这就是我想要做的事情:
- 准备通过从 A 设置 B 的一些变量来从 A 到 B。
- 执行从 A 到 B 的 segue。
- B 出现。
- 使用 显示“加载”活动指示器
[MBProgressHUD][1]
。 - 在后台任务中,从 URL 检索数据。
- 如果 URL 请求发生错误(未收到数据或非 200 状态码),(a) 隐藏活动指示器,然后 (b) 显示带有错误消息的 UIAlertView
- 否则,(a)
tableView
用检索到的数据重新加载 B,然后 (b) 隐藏活动指示器
但是,这就是正在发生的事情,我不知道如何解决它:
- 单击 A 中的一个单元格后,B 从右侧滑入一个空白的 plain
UITableView
。MBProgressHUD
不显示。 - 过了一会儿,
tableView
重新加载检索到的数据,MBProgressHUD
出现非常短暂。 MBProgressHUD
立即消失。
执行后台任务的方式似乎没有错误。我的问题是,如何在MBProgressHUD
B 视图控制器出现后立即显示活动指示器?(实际上,为什么它没有显示?)代码如下。
A
的prepareForSegue
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
B *b = (B *)[segue destinationViewController];
// Set some of B's variables here...
}
相关方法在B
- (void)viewDidAppear:(BOOL)animated {
[self startOver];
}
- (void)startOver {
[self displayLoadingAndDisableTableViewInteractions];
[self retrieveListings];
[self.tableView reloadData];
[self hideLoadingAndEnableTableViewInteractions];
}
- (void)displayLoadingAndDisableTableViewInteractions {
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.labelText = @"Loading";
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
self.tableView.userInteractionEnabled = NO;
}
- (void)hideLoadingAndEnableTableViewInteractions {
[MBProgressHUD hideHUDForView:self.view animated:YES];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
self.tableView.userInteractionEnabled = YES;
}
- (void)retrieveListings {
__block NSArray *newSearchResults;
// Perform synchronous URL request in another thread.
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
newSearchResults = [self fetchNewSearchResults];
});
// If nil was returned, there must have been some error--display a UIAlertView.
if (newSearchResults == nil) {
[[[UIAlertView alloc] initWithTitle:@"Oops!" message:@"An unknown error occurred. Try again later?" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
} else {
// Add the retrieved data to this UITableView's model. Then,
[self.tableView reloadData];
}
}
- (NSArray *)fetchNewSearchResults {
// Assemble NSMutableArray called newSearchResults from NSURLConnection data.
// Return nil if an error or a non-200 response code occurred.
return newSearchResults;
}