"wait_fences:未收到回复:10004003"?

Mic*_*ael 94 iphone cocoa-touch objective-c

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

- (void)viewWillAppear:(BOOL)animated
{
    [textField becomeFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)

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

奇怪的是,如果我把线放入-viewDidAppear:而不是-viewWillAppear:; 也就是说,不是打印错误仅在第一次键盘显示永不再,该错误打印第一次,但之后每次.这给我带来了很大的麻烦.

Rob*_*ier 104

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

  • 这不能解决问题.如果你在viewDidAppear中抛出一个UIAlertSheet,在调用[super viewDidAppear:animated]之后,每次都会得到相同的消息.但是,如果你之后把它扔了,说回应一个ibaction,没问题.所以performWithSelector可能是修复的方法,或者你可以忽略该消息,无论是这似乎是一个SDK错误,而不是你的代码的问题. (14认同)
  • @Billy,在完成动画制作之前抛出UIAlertSheet可能会导致同样的问题.无论如何你在viewDidAppear中放置一张表可能太早了你可能应该使用performSelector:afterDelay:将UIAlertSheet推送到下一个循环.这不是SDK中的错误,尽管这里的详细信息记录很少.在-viewWillAppear中执行动画是原始代码中的错误.在任何一种情况下,您都不应忽略该消息.它可能导致奇怪的视觉效果(动画的奇怪侧向滑动). (9认同)
  • @Michael,我提供了一个[yesFirstResponder`的解决方案,可以立即显示键盘,没有延迟](http://stackoverflow.com/questions/1371346/wait-fences-failed-to-receive-reply-10004003/ 6880606#6880606). (4认同)

Cor*_*oyd 22

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

  1. 解散模态视图
  2. 更新主视图
  3. 提出一个新的模态视图

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

我的解决方案是推迟新模态视图的呈现.似乎快速更新视图层次结构导致Apple的代码中出现了一些竞争条件.

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

     - (void)viewDidAppear:(BOOL)animated{

            [super viewDidAppear:animated];
            [textField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.1];
  }
Run Code Online (Sandbox Code Playgroud)

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

此外,为了以防万一,您在呈现键盘之前暂停给予层次结构更新时间.

希望这可以帮助.

  • 对于你使用模态的问题,在呈现新模态之前,你是否等待模态完成解雇?您可以通过在modalViewController中覆盖-viewDidDisappear来了解而不是等待一段任意时间并希望它完成.这可以回调模态的-parentViewController,也可以发布通知.关键是要明白,要求某些东西被解雇并不意味着它已经消失了,而且你不应该在一般情况下将事物放在一起.-viewWill/DidDisappear通常是您确定事情发生的最佳方式. (3认同)

dia*_*lic 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];
    }
});
Run Code Online (Sandbox Code Playgroud)


小智 9

在尝试了我可以在Google上找到的所有内容并且没有一个能够正常工作之后,这就解决了我的问题.关键是我在willDismissWithButtonIndex委托方法中做这个东西.在我在其他地方做之前.

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


小智 8

如果viewDidLoad中包含以下行,则可能导致此消息.评论以下行.

[[UIApplication sharedApplication] setStatusBarHidden:YES]; //This line should be commented
Run Code Online (Sandbox Code Playgroud)

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


nve*_*aud 7

经过一些测试后,最重要的规则是:"不要在动画解雇或动画节目之前进行动画制作."

例如:

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

坏事可能会发生.

希望它会有用;-)


Gan*_*ani 5

你做完了 [textfield becomeFirstResponder];

在从代码中的textfield获取值之后,执行[textfield resignFirstResponder];.我认为这对你有所帮助.


ma1*_*w28 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;
}
Run Code Online (Sandbox Code Playgroud)

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

MyViewController *viewController = [[MyViewController alloc] init];
[viewController.textField becomeFirstResponder];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];
Run Code Online (Sandbox Code Playgroud)