【问题标题】:"wait_fences: failed to receive reply: 10004003"?“wait_fences:未能收到回复:10004003”?
【发布时间】:2010-11-25 04:11:12
【问题描述】:

由于以下代码行,我第一次(也是第一次)加载我的视图时遇到了这个神秘的错误:

- (void)viewWillAppear:(BOOL)animated
{
    [textField becomeFirstResponder];
}

有一个明显的延迟(大约 3 到 4 秒,即使在模拟器上也是如此),这让我的应用感觉没有响应。有谁知道如何解决这一问题?我在 Apple 的网站上找不到任何文档,在此处或在 Google 上找不到任何解决方案。

奇怪的是,如果我将行放在-viewDidAppear: 而不是-viewWillAppear:,则会发生相反的情况;也就是说,不是只在第一次显示键盘时打印错误,以后再也不打印错误,而是第一次打印错误,但之后每次都打印。这让我很头疼。

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

    解决方案来了!

    我有同样的错误,现在我得到了解决方案,这可能会对你有所帮助。

    - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
      [self performSelector:@selector(YOUR_METHOD) withObject:nil afterDelay:0.1];
    }
    

    【讨论】:

      【解决方案2】:

      警报视图或操作表应显示在主线程上...因此,如果您进行任何同步连接并在另一个线程上执行该操作并根据您从该操作收到的输出显示警报,那么您将收到此错误消息 wait_fences :收不到回复:10004003。你可以这样做......

      [self performSelectotOnMainThread:@selector(handleOutput:) withObject:output waitUntilDone:YES/NO];
      

      并在handleOutput 方法中显示警报,将输出响应字符串作为参数传递。

      【讨论】:

        【解决方案3】:

        问题在于 Apple 的代码中存在竞争条件。通常,这与不正确的 UI 更新有关。

        根据我的经验,您要么没有在 viewDidAppear、viewWillAppear 等中调用 super。要么您尝试在 viewDidLoad 或 viewWillAppear 中显示 UIAlertView。

        当您添加 UIAlertView 时,框架需要对您的父视图的引用。但是,如果您在 viewWillAppear 或 viewDidLoad 中,则视图实际上并没有显示...您应该考虑将代码移动到 viewDidAppear 视图已准备好供 UIAlertView 使用的位置。

        【讨论】:

          【解决方案4】:

          我可以通过这个 UIAlertView 代码来模拟这种一对一。

             UIAlertView *alert = [[UIAlertView alloc]
                             initWithTitle:NSLocalizedString(@"defineTitle",@"defineTitle")
                                   message:NSLocalizedString(@"defineBody", @"defineBody")
                                  delegate:self
                         cancelButtonTitle:NSLocalizedString(@"Ok", @"Ok")
                         otherButtonTitles:nil];
             [alert show];
          

          当 NSLocalizedString 未在 Localizable.strings 文件中定义时 搜索文本太长,因此会显示警报并显示“wait_fences: failed to receive reply: 10004003”。

          对我来说,我只需将文本添加到 Localizable.strings 文件中,我的问题就解决了。也许其他情况也是如此?

          【讨论】:

            【解决方案5】:

            如果您在 viewDidLoad 中有以下行,则可能会导致此消息。注释以下行。

            [[UIApplication sharedApplication] setStatusBarHidden:YES]; //This line should be commented
            

            (您可以改为从应用程序 plist 文件中禁用状态栏)。

            【讨论】:

              【解决方案6】:

              检查您是否仅在主线程上与 UI 交互。当我坐在那里等待 UIAlertView 显示大约 5 秒时,我收到了wait_fences: failed to receive reply: 10004003,因为相关代码是在后台线程上执行的。您可以通过将代码放入块中并将其发送到主线程来确保:

              dispatch_async(dispatch_get_main_queue(), ^{
                  if (!success) {
                      // Inform user that import failed
                      UIAlertView * importFailedAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"ErrorTitle5", @"Import failed") 
                                                                                   message:NSLocalizedString(@"Error5", @"Something went wrong") 
                                                                                  delegate:nil 
                                                                         cancelButtonTitle:NSLocalizedString(@"OK", nil) 
                                                                         otherButtonTitles:nil];
                      [importFailedAlert show];
                  }
              });
              

              【讨论】:

                【解决方案7】:

                经过几次测试,大规则是:“不要在动画解散或动画展示之前执行动画。”。

                例如:

                • 不要在UIAlertView -alertView:的委托回调之后调用-dismissModalViewControllerAnimated:YESwillDismissWithButtonIndex:(在使用-alertView:执行此操作之前等待警报视图淡出didDismissWithButtonIndex:回调)
                • 在您的视图控制器出现在屏幕上之前,不要尝试显示键盘 (becomeFirstResponder)。

                可能会发生坏事。

                希望它有用;-)

                【讨论】:

                • 我使用的是 clickedButtonAtIndex,并且会在警报视图被解除之前填充一堆文本字段。将其切换为 didDismissWithButtonIndex 无疑有助于消除这些警告!谢谢!
                【解决方案8】:

                你已经完成了[textfield becomeFirstResponder];

                从代码中的文本字段中获取值后,执行[textfield resignFirstResponder];。我想这会对你有所帮助。

                【讨论】:

                  【解决方案9】:

                  覆盖viewDidappear,而不是viewWillAppear

                  -(void) viewDidAppear:(BOOL) animated
                  {
                   [super viewDidAppear:animated];
                   [myTextField becomeFirstResponder];
                  }
                  

                  【讨论】:

                    【解决方案10】:

                    这对我来说很有效,让键盘立即显示出来,没有动画或延迟。

                    textField 成为MyViewController 的实例变量(UIViewController 的子类)。

                    initWithNibName:bundle:(对于UIViewController 的子类)或initWithStyle:(对于UITableViewController 的子类)中调用[textField becomeFirstResponder],而不是在viewDidLoad 中。例如:

                    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
                        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
                        if (self) {
                            [textField becomeFirstResponder];
                        }
                        return self;
                    }
                    

                    或者,在初始化之后但在推送UIViewController 之前调用它。例如:

                    MyViewController *viewController = [[MyViewController alloc] init];
                    [viewController.textField becomeFirstResponder];
                    [self.navigationController pushViewController:viewController animated:YES];
                    [viewController release];
                    

                    【讨论】:

                    • 有趣。你确定这一直有效吗?我担心的是你没有引用view,所以不确定nib文件是否已经加载。如果textField 是一个IBOutlet,那么我认为此时它会为零。
                    【解决方案11】:

                    还有 UIAlertView。正如前面提到的warehouselabs,为我解决的问题是如下辞职。

                    - (void)didPresentAlertView:(UIAlertView *)alertView
                    {
                        [txtListingPassword becomeFirstResponder];
                    }
                    
                    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
                    {
                        [txtListingPassword resignFirstResponder];
                    }
                    

                    UIAlertViewDelegate 的其他代表没有解决此问题。

                    【讨论】:

                      【解决方案12】:

                      我也收到消息wait_fences: failed to receive reply: 10004003,而我的viewWill...viewDid... 方法除了向super 发送消息外什么也不做。在我的情况下,当我的GameViewController 中显示UIAlertView 而用户按下 iPhone 圆形设备按钮然后返回应用程序时,就会发生这种情况。这看起来不合我的意。

                      【讨论】:

                        【解决方案13】:

                        在尝试了我在 Google 上可以找到的所有内容但都没有奏效之后,这就是为我解决问题的方法。关键是我在 willDismissWithButtonIndex 委托方法中做这些事情。在我在其他地方做之前。

                        - (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex
                        {
                            [myTextField resignFirstResponder];
                            [myTextField removeFromSuperview];  
                            [myTextField release];  
                        }
                        

                        【讨论】:

                          【解决方案14】:

                          如果您正在运行当前的 iPhone Simulator 4.0,则在旋转屏幕时(或在旋转屏幕后制作动画时)会频繁出现此错误消息,并且动画会出现 1-2 秒的延迟。

                          这是该版本模拟器中的一个错误,应该会尽快修复。

                          【讨论】:

                          • 感谢您提供有关 iOS4 模拟器错误的信息。对于同一个项目,wait_fences 消息没有出现在 3.1 模拟器中
                          【解决方案15】:

                          我很快就遇到了类似的错误:

                          1. 关闭模态视图
                          2. 更新主视图
                          3. 呈现新的模态视图

                          我注意到我只是在模拟器中而不是在设备上获得它。此外,我陷入了无限循环。

                          我的解决方案是延迟新模式视图的呈现。似乎快速更新视图层次结构在 Apple 的代码中引起了一些竞争条件。

                          考虑到这一点,试试这个:

                               - (void)viewDidAppear:(BOOL)animated{
                          
                                      [super viewDidAppear:animated];
                                      [textField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.1];
                            }
                          

                          您可能在为尚未出现在屏幕上的 UITextField 显示键盘时遇到问题。 这可能会导致类似于我的问题。

                          此外,您在展示键盘之前暂停让层次结构有时间更新,以防万一。

                          希望这会有所帮助。

                          【讨论】:

                          • 对于您在使用模态时遇到的问题,您是否在呈现新模态之前等待模态完成关闭?无需等待任意时间并希望它完成,您可以通过覆盖 modalViewController 中的 -viewDidDisappear 来知道。这可以回调模态的-parentViewController,或者可以发布通知。关键是要明白,要求取消某些东西并不意味着它已经消失了,而且您通常不应该在彼此之上设置动画。 -viewWill/DidDisappear 通常是您确定事情何时发生的最佳方式。
                          • 第一个模态视图是照片选择器,我在照片选择器回调方法中处理所有事情。你的权利,我应该在 viewDdiAppear 中放置代码以启动下一个模式视图。这是一个更好的解决方案,并且很可能会解决任何平台的问题。
                          【解决方案16】:

                          覆盖-viewDidAppear:,而不是-viewWillAppear,并确保调用[super viewDidAppear:]。当您不在屏幕上时(“将出现”),您不应该执行动画。 -viewDidAppear: 文档解释说您必须致电 super,因为他们有自己的事情要做。

                          【讨论】:

                          • 这没有我想要的响应速度(每次显示键盘仍有一点延迟),但它似乎可以解决问题。
                          • 我知道你所说的延迟。我在很多应用程序中都看到过。如果您还没有,您可以尝试在调用 -[super viewDidAppear:] 之前(而不是之后)调用 -becomeFirstResponder。这可能没有影响,但可能会在同一个事件循环而不是下一个事件循环中开始动画。我还没有对此进行实验以确认。
                          • 这并不能解决问题。如果您在 viewDidAppear 中抛出 UIAlertSheet,在调用 [super viewDidAppear:animated] 之后,您每次都会收到相同的消息。但是,如果您事后将其扔掉,例如响应 ibaction,则没问题。因此 performWithSelector 可能是修复的方法,或者您可以忽略该消息,无论哪种方式这似乎都是 SDK 错误,而不是您的代码问题。
                          • @Billy,在动画完成之前抛出 UIAlertSheet 可能会导致同样的问题。无论如何,您在 viewDidAppear 中放置一张工作表可能为时过早,您可能应该使用 performSelector:afterDelay: 将 UIAlertSheet 推送到下一个循环。这不是 SDK 中的错误,尽管此处的详细信息记录不充分。在 -viewWillAppear 中执行动画是原始代码中的错误。在任何一种情况下,您都不应该忽略该消息。它可能会导致奇怪的视觉伪影(动画奇怪的横向滑动)。
                          【解决方案17】:

                          文本字段是否包含在该视图中,还是包含在其他内容中?您只能将“becomeFirstRepsonder”发送到直接包含在该视图中的内容。如果它存储在其他一些小部件组件中,则不应在此小部件中设置第一响应者状态,而应在正在创建的小部件中设置。例如,如果您将文本字段添加到警报视图,因为显示是异步发生的,所以在您调用 becomeFirstResponder 时它可能尚未启动。 (理想情况下,您应该拥有自己的警报视图类并在其中定义文本字段,当 那个 视图接收到 viewDidAppear 时,您会在此时将文本字段设置为第一响应者。)

                          【讨论】:

                            【解决方案18】:

                            【讨论】:

                            • 感谢您的帮助,但不幸的是,我在该页面上找不到解决问题的方法。 “当子视图(例如 UIAlertView)在其父/超级视图之前创建时,似乎会发生这种情况。”这不应该发生在上面的代码中,对吧?
                            猜你喜欢
                            • 2011-05-02
                            • 1970-01-01
                            • 1970-01-01
                            • 2011-02-05
                            • 1970-01-01
                            • 2023-03-22
                            • 2012-09-17
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多