我正在开发一个应用程序,当用户第一次开始使用UIAlert询问他们是否想要使用他们当前的位置时,会弹出一个UIAlert。这发生在主控制器内。但是,使用UIAlert时出现以下错误:
wait_fences: failed to receive reply: 10004003
我调试了它,然后用Google搜索。我没有使用textarea或键盘输入,所以我不必辞职第一响应者。但是,我仍然无法弄清楚为什么我会收到此错误。它只在我添加UIAlert时出现。
MainController.m
- (void)viewDidLoad {
UIAlertView *mainAlert = [[UIAlertView alloc]
initWithTitle:@"Location"
message:@"Do you wish to use your current location?"
delegate:self
cancelButtonTitle:nil
otherButtonTitles:@"No Thanks", @"Sure!", nil];
[mainAlert show];
[mainAlert release];
[super viewDidLoad];
}
头文件的构造如下:
@interface MainController : UIViewController
<CLLocationManagerDelegate,
MKReverseGeocoderDelegate, UIAlertViewDelegate>
答案 0 :(得分:17)
这个wait_fences: failed to receive reply:
的原因也可能是你试图在mainThread
(这是GUI线程)时显示警告。
调度到GUI线程有助于:
dispatch_async(dispatch_get_main_queue(), ^{
[mainAlert show];
});
答案 1 :(得分:8)
我通过向UIAlert添加一点延迟解决了这个问题:下面是我的 ViewDidLoad 方法(它在 ViewDidAppear 中也可以正常工作):
[self performSelector:@selector(testAlert) withObject:nil afterDelay:0.1];
由于某种原因,延迟成功了。然后我调用了另一种方法(我当然会重命名它)。
- (void) testAlert
{
UIAlertView *mainAlert = [[UIAlertView alloc] initWithTitle:@"Location" message:@"Do you wish to use your current location?" delegate:self cancelButtonTitle:nil otherButtonTitles:@"No Thanks", @"Sure!", nil];
[mainAlert show];
[mainAlert release];
}
答案 2 :(得分:1)
在执行任何其他操作之前,请务必致电[super viewDidLoad];
。这也解释了延迟的原因。
希望我是对的。 :)
答案 3 :(得分:0)
尝试在-viewDidAppear:(BOOL)动画中显示UIAlert。 -viewDidLoad在加载视图时调用,但在屏幕之前调用。
答案 4 :(得分:0)
我有类似的问题。我在ViewDidLoad中添加了一个观察者,用于获取可达性通知,该通知在ViewDidAppear完成之前发布。
所以ViewController试图在完全绘制自己的View之前显示一个UIAlertView。
我将观察者添加到ViewDidAppear,并在ViewDidAppear中启动了可达性的startNotifier。此外,代码中错过了对[super viewDidAppear]的调用。这两个问题都得到纠正,应用程序再次正常运行。
如果你得到这个wait_fences:没有收到回复:10004003错误一次,你可能无法在应用程序中进一步呈现任何模态ViewControllers。这是我在我的应用程序中遇到的问题。有时,当尝试呈现一个模态ViewController时,应用程序将进入无限循环。
正如艾伦所说,永远记得“尝试在-viewDidAppear:(BOOL)动画中显示UIAlert。-viewDidLoad在加载视图时被调用,但在屏幕上显示之前。”