【问题标题】:wait_fences: failed to receive reply: 10004003 error - UIAlert WITHOUT UITextField presentwait_fences:未能收到回复:10004003 错误 - UIAlert WITHOUT UITextField present
【发布时间】:2011-05-13 14:47:47
【问题描述】:

我正在开发一个应用程序,当用户第一次开始使用它时会弹出 UIAlert 以询问他们是否要使用当前位置。这发生在主控制器内。但是,使用 UIAlert 时出现以下错误:

wait_fences: failed to receive reply: 10004003

我调试了它,然后用谷歌搜索了一下。我没有使用文本区域或键盘输入,所以我不必辞去第一响应者的职务。但是,我仍然无法弄清楚为什么会收到此错误。它仅在我添加 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>

【问题讨论】:

    标签: iphone uialertview


    【解决方案1】:

    我遇到了类似的问题。我在 ViewDidLoad 中为可达性通知添加了一个观察者,该通知在 ViewDidAppear 完成之前发布。

    所以 ViewController 试图在自己的 View 完全绘制之前显示一个 UIAlertView。

    我将 Observers 的添加移到 ViewDidAppear 中,并在 ViewDidAppear 中启动了可达性的 startNotifier。代码中也错过了对 [super viewDidAppear] 的调用。这两个问题都得到了纠正,应用程序再次正常工作。

    如果您收到此 wait_fences: failed to receive reply: 10004003 错误,您可能无法在应用程序中进一步显示任何模态视图控制器。这是我在我的应用程序中遇到的问题。有时,当尝试呈现一个模态 ViewController 时,应用程序会进入无限循环。

    正如 Alan 所说,请始终记住“尝试在 -viewDidAppear:(BOOL)animated 中显示 UIAlert。-viewDidLoad 在您的视图加载时调用,但在它出现在屏幕上之前。”

    【讨论】:

      【解决方案2】:

      我通过向 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];
      }
      

      【讨论】:

        【解决方案3】:

        wait_fences: failed to receive reply: 的原因也可能是您尝试在不在mainThread(这是 GUI 线程)上时显示警报。

        分派到 GUI 线程有帮助:

        dispatch_async(dispatch_get_main_queue(), ^{ 
          [mainAlert show];
        });
        

        【讨论】:

        • 你怎么知道他不在主线? viewDidLoad 总是在主线程上调用。
        【解决方案4】:

        在您做任何其他事情之前,请务必致电[super viewDidLoad];。这也解释了为什么延迟有效。

        希望我是对的。 :)

        【讨论】:

          【解决方案5】:

          尝试在 -viewDidAppear:(BOOL)animated 中显示 UIAlert。 -viewDidLoad 在您的视图加载时调用,但在它出现在屏幕上之前。

          【讨论】:

          • 艾伦,我试过这个..将代码移到 viewDidAppear 函数,但仍然收到相同的错误消息。
          • 我认为发生此错误是因为您在导航动画完成之前显示 UIAlertView。你是先调用 [super viewDidAppear:animated] 吗?
          猜你喜欢
          • 2023-03-22
          • 2011-05-02
          • 2010-11-25
          • 1970-01-01
          • 1970-01-01
          • 2010-11-29
          • 1970-01-01
          • 2011-02-05
          • 1970-01-01
          相关资源
          最近更新 更多