“ wait_fences:未能收到回复:10004003”?


94

由于以下代码行,我第一次(也是第一次)收到此神秘错误:

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

因此,有一个明显的延迟(甚至在模拟器上约为3-4秒),这使我的应用程序无响应。有谁知道如何解决这一问题?我在Apple网站上找不到任何文档,也没有在这里或Google上找到任何解决方案。

奇怪的是,如果我插入该行-viewDidAppear:而不是-viewWillAppear:;,则会出现相反的情况。也就是说,不是只在第一次显示键盘时才打印错误,而是从不再次显示错误,而是不是第一次而是在每次之后都显示错误。这给我造成了极大的头痛。

Answers:


103

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


这没有我想要的那样响应(每次显示键盘仍然会有一点延迟),但这似乎可以解决问题。
迈克尔

1
我知道你在说的滞后。我已经在很多应用程序中看到了。如果您尚未调用-becomeFirstResponder,请尝试(而不是之后)调用-[super viewDidAppear:]。这可能没有影响,但可能会使动画在同一事件循环中而不是下一个事件循环中开始。我还没有尝试过进行验证。
罗布·纳皮尔2009年

14
这不能解决问题。如果您在调用[super viewDidAppear:animated]之后在viewDidAppear中抛出UIAlertSheet,则每次都会得到相同的消息。但是,如果您事后将它扔了出来,比如回应,那没问题。因此,performWithSelector可能是修复的方法,或者您可能忽略了此消息,这似乎是SDK错误,而不是代码问题。
比利·格雷

9
@Billy,在完成动画之前抛出UIAlertSheet可能会导致相同的问题。无论如何,您在viewDidAppear内放置一张表可能为时过早,您可能应该使用performSelector:afterDelay:将UIAlertSheet推送到下一个循环。尽管此处的详细记录很少,但并不是SDK中的错误。在-viewWillAppear中执行动画是原始代码中的错误。无论哪种情况,您都不应忽略该消息。它可能导致奇怪的视觉伪像(动画的奇怪的横向滑动)。
罗布·纳皮尔


22

我很快就收到类似的错误:

  1. 消除模态视图
  2. 更新主视图
  3. 呈现新的模式视图

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

我的解决方案是延迟提出新的模式视图。看来,快速更新视图层次结构在Apple的代码中造成了一些竞争状况。

考虑到这一点,请尝试以下操作:

     - (void)viewDidAppear:(BOOL)animated{

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

您可能在显示尚未显示在屏幕上的UITextField的键盘时遇到问题。这可能会引起类似于我的问题。

另外,为防万一,您在显示键盘之前暂停给层次结构更新的时间。

希望这可以帮助。


3
对于您在使用模态时遇到的问题,您是否等待模态结束后再提出新的模态?您可以通过覆盖modalViewController中的-viewDidDisappear来知道,而不是等待任意时间并希望它完成。这可以回调到模态的-parentViewController,或者可以发布通知。关键是要理解,要求解散某事物并不意味着它已经消失了,一般而言,您不应将事物动画化。-viewWill / DidDisappear通常是确定何时发生的最佳方法。
罗布·纳皮尔

第一个模式视图是照片选择器,我负责照片选择器回调方法中的所有操作。您的权利,我应该放置代码以在viewDdiAppear中启动下一个模式视图。这是一个更好的解决方案,并且很可能会解决此问题,无论使用什么平台。
科里·弗洛伊德

12

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

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];
    }
});

9

在尝试了我在Google上可以找到的所有内容之后,所有方法都无法正常工作,这就是为我解决了问题的方法。关键是我正在willDismissWithButtonIndex委托方法中执行此操作。在我在其他地方做之前。

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

8

如果viewDidLoad中包含以下行,则可能导致此消息。注释以下行。

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

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


7

经过几次测试后,一个大规则是:“不要在动画解雇或动画放映之前执行动画。”。

例如:

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

坏事可能发生。

希望它会有用;-)


我使用的是clickedButtonAtIndex,并且会在关闭alertview之前填充一堆文本字段。将其切换为didDismissWithButtonIndex无疑有助于摆脱这些警告!谢谢!
Nitin Alabur 2012年

5

这对我来说非常有用,它可以使键盘立即显示出来,而没有动画或延迟。

textField是一个实例变量MyViewController(的子类UIViewController)。

通话[textField becomeFirstResponder]initWithNibName:bundle:(用于一个子类UIViewController)或initWithStyle:(对于的子类UITableViewController),而不是在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,那么我认为这将是零。
罗布·纳皮尔

5

你做完了 [textfield becomeFirstResponder];

在代码中从文本字段获取值之后,请执行[textfield resignFirstResponder];。我认为这将对您有所帮助。


4

如果您正在运行当前的iPhone Simulator 4.0,则在旋转屏幕时(或在旋转屏幕后进行动画处理时)会经常出现此错误消息,并伴有1-2秒的动画延迟。

这是此版本的模拟器中的错误,应尽快修复。


感谢您提供有关iOS4模拟器错误的信息。对于同一项目,该wait_fences消息未显示在3.1仿真器中
ohho,2010年

3

感谢您的帮助,但是很遗憾,我无法在该页面上找到解决问题的方法。“在子视图(例如UIAlertView)在其父视图/超级视图之前创建时,似乎会发生这种情况。” 上面的代码中不应该发生这种情况,对吧?
迈克尔

3

覆盖viewDidappear,不viewWillAppear

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

3

我可以通过此UIAlertView代码进行一对一模拟。

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

当在Localizable.strings文件中未定义NSLocalizedString时,搜索文本将花费很长时间,因此将显示警报,并显示“ wait_fences:无法接收答复:10004003”。

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


1

也可以使用UIAlertView。正如我前面提到的仓库实验室那样,为我解决的问题是辞职如下。

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

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

UIAlertViewDelegate的其他委托没有解决此问题。


1

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

以我的经验,您可能没有在viewDidAppear,viewWillAppear等中调用super。或者您尝试在viewDidLoad或viewWillAppear中显示UIAlertView。

添加UIAlertView时,框架需要引用您的父视图。但是,如果您使用的是viewWillAppear或viewDidLoad,则实际上不会显示该视图...您应该考虑将代码移至viewDidAppear,其中UIAlertView已准备好使用该视图。


0

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


0

我也收到了消息wait_fences: failed to receive reply: 10004003,我的viewWill...viewDid...方法除了将消息发送到之外什么也没做super。以我为例,当我有一个演出时,它发生了UIAlertViewGameViewController而用户却按下了iPhone圆形设备按钮,然后返回到应用程序。这看起来不合我意。


0

Alertview或actionsheets应该显示在主线程上...因此,如果您建立任何同步连接并在另一个线程上执行该操作,并根据从该操作接收到的输出来显示警报,则将收到此错误消息wait_fences:收到回复:10004003。您可以做类似...的事情。

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

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


0

解决方案在这里!

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

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
  [self performSelector:@selector(YOUR_METHOD) withObject:nil afterDelay:0.1];
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.