UIActivityIndicatorView 不呈现
Posted
技术标签:
【中文标题】UIActivityIndicatorView 不呈现【英文标题】:UIActivityIndicatorView doesn't render 【发布时间】:2013-10-18 17:16:48 【问题描述】:我已经查看了许多有关此问题的帖子,但均未成功。我有两个表视图控制器,一个源和一个目标,都在一个导航控制器中。当用户点击源表视图控制器中的单元格时,会实例化一个对象,该对象会进行 Web 服务调用,这可能需要几秒钟的时间,具体取决于网络速度。一旦进行此 Web 服务调用,就会执行 segue,并且导航会从源移动到目标。我想要一个活动指示器来显示此 Web 服务调用的时间。过去几天我尝试过的任何事情都没有奏效,甚至在这个论坛上标记为成功的帖子也是如此。所以,一定有什么……这是我到目前为止的代码:
源表视图控制器标题:
@property (strong, nonatomic) UIActivityIndicatorView *activityIndicator;
源表视图控制器实现:
@synthesize activityIndicator;
-(void)loadView
[super loadView];
self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[self.view addSubview:self.activityIndicator];
self.activityIndicator.center = CGPointMake(self.view.frame.size.width / 2, self.view.frame.size.height / 2);
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
NSString *stateAbbr;
if([segue.identifier isEqualToString:@"sgShowStateDetail"])
DetailTableViewController *detailVC = [segue destinationViewController];
NSIndexPath *path = [self.tableView indexPathForSelectedRow];
NSArray *tempArray = (NSArray*)[groupedStates objectAtIndex:path.section];
NSString *key = [tempArray objectAtIndex:path.row];
stateAbbr = [statesDict objectForKey:key];
[detailVC setStateIdentifier:stateAbbr];
// begin activity indicator here
[self.view bringSubviewToFront:activityIndicator];
[activityIndicator startAnimating];
gauges = [[GaugeList alloc] initWithStateIdentifier:stateAbbr andType:nil];
[activityIndicator stopAnimating];
[detailVC setStateGauges:gauges];
// end activity indicator here
GaugeList 是执行 Web 服务调用的对象。
一切都按预期工作,除了从来没有活动指示器。没有错误。我究竟做错了什么?谢谢!
【问题讨论】:
对您的网络服务的调用在哪里?是这条线吗?仪表 = [[GaugeList alloc] initWithStateIdentifier:stateAbbr andType:nil]; 是的,编辑了原始帖子以反映这一点。谢谢! 那么你不应该在prepareForSegue中执行那个。否则它会被阻止,UI 根本不会刷新。你可以把同样的代码放到tableView中:didSelectRowAtIndexPath: method. 也许不是主要问题,但你不应该重写 loadView 只是为了添加一个子视图。请改用 viewDidLoad。 【参考方案1】:我认为您可能使用了错误的模式。对 Web 服务的调用必须在后台进行,而活动指示器必须在主线程中显示和隐藏。因此
__block NSArray *gauges;
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
gauges = [[GaugeList alloc] initWithStateIdentifier:stateAbbr andType:nil];
dispatch_async(dispatch_get_main_queue(), ^
[activityIndicator stopAnimating];
[detailVC setStateGauges:gauges];
;
;
【讨论】:
【参考方案2】:这里是使用tableView: didSelectRowAtIndexPath:
而不是prepareForSegue:
的代码
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
[self.view bringSubviewToFront:activityIndicator];
[activityIndicator startAnimating];
dispatch_async(dispatch_queue_create("", nil), ^
NSString *stateAbbr;
DetailTableViewController *detailVC = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailTableViewController"];
NSArray *tempArray = (NSArray*)[groupedStates objectAtIndex:indexPath.section];
NSString *key = [tempArray objectAtIndex:indexPath.row];
stateAbbr = [statesDict objectForKey:key];
[detailVC setStateIdentifier:stateAbbr];
gauges = [[GaugeList alloc] initWithStateIdentifier:stateAbbr andType:nil];
[detailVC setStateGauges:gauges];
dispatch_async(dispatch_get_main_queue(), ^
[activityIndicator stopAnimating];
[self.navigationController pushViewController:detailVC animated:YES];
);
);
【讨论】:
不幸的是,这会产生一些非常奇怪的行为。目标已加载,但最初为空。然后它呈现,但导航控制器然后消失。而且,活动指示器从不显示。我想 presentViewController 不会推送,而是显示模态视图 您的视图控制器在导航控制器中吗? 是的,我再次道歉并编辑了主要帖子以反映这一点。 这是一种正确的模式,但我不会尝试从主队列之外的情节提要中实例化视图控制器,我假设-setStateGauges:
可能涉及 UI 调用,这也应该不会在后台发生。
那么你的navigationController在点击tableCell后是否会立即推入detailVC?以上是关于UIActivityIndicatorView 不呈现的主要内容,如果未能解决你的问题,请参考以下文章
UIActivityIndi catorView未在webview中显示
UIButton里面的UIActivityIndicatorView
Swift UIPageViewController & UIActivityIndicatorView
如何在 UIAlertView 的中心添加 UIActivityIndicatorView?