1

在用户在模态视图控制器中按下“登录”后,我试图显示一个UIAlertViewwith 。UIActivityIndicator要登录,凭据将发送到使用类的sendAsynchronousRequest:queue:completionHandler:服务器NSURLConnection。我的实现如下:

UIAlertView * spinner = [[UIAlertView alloc] initWithTitle:@"Connecting to server..." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil];
[spinner show];
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
indicator.center = CGPointMake(spinner.bounds.size.width * 0.5f, spinner.bounds.size.height * 0.5f+5.0f);
[indicator startAnimating];
[spinner addSubview:indicator];
[indicator release];

[NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * res, NSData * data, NSError * err) {
    [spinner dismissWithClickedButtonIndex:0 animated:YES];
    [spinner release];
    ...
}

如果无法访问服务器或服务器速度很慢,这似乎可以正常工作,但如果服务器立即回复,则微调器似乎在控制台日志记录后 3-5 秒后才被关闭

wait_fences: failed to receive reply: 10004003

我认为发生这种情况是因为我正在关闭模式视图控制器(登录屏幕),而UIAlertView它仍在显示,但我不确定为什么会发生这种情况,因为它通常应该被关闭。我做错了什么,正确的做法是什么?

4

2 回答 2

3

我已经多次看到这个日志 - 它总是由内部动画框架中的意外状态或默认视图动画之间的冲突引起的。

可能的原因:

  1. 在实际显示视图之前viewDidLoad,从内部或类似方法开始动画。viewWillAppear
  2. UIAlertView当另一个UIAlertView动画仍在运行时显示/隐藏。这包括显示来自 的警报alertView:didDismissWithButtonIndex:
  3. 模态视图动画和警报动画之间的冲突。
  4. UINavigationController推送/弹出动画和警报动画之间的冲突。

您的情况:您可能在警报完全显示之前就隐藏了警报,并且两个动画之间发生了冲突。显示动画通常需要大约 0.4 秒,但您的响应可以更早到达 - 触发隐藏动画。

可能的解决方案:

  1. 动画结束时触发请求 ( didPresentAlertView)。
  2. 测量连接的持续时间,如果小于 0.4 秒,请延迟隐藏动画。
于 2012-07-11T11:24:13.780 回答
0

如果发生动画的 View Controller 没有出现,则不应制作动画。所以 viewDidLoad 中没有动画。在 viewDidAppear 中尝试。这样更安全。看看这里

希望这可以帮助。

干杯!

于 2012-07-11T11:00:11.767 回答