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

时间:2009-09-03 03:48:33

标签: iphone objective-c cocoa-touch

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

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

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

奇怪的是,如果我将该行放在-viewDidAppear:而不是-viewWillAppear:中,则会发生相反的情况;也就是说,不是仅在第一次显示键盘时打印错误而不是再次打印错误,而是第一次打印错误,而不是每次都打印错误。这对我来说是一个令人头痛的问题。

18 个答案:

答案 0 :(得分:104)

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

答案 1 :(得分:22)

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

  1. 解除模态视图
  2. 更新主视图
  3. 提出新的模态视图
  4. 我注意到我只是在模拟器中而不是在设备上。另外,我陷入了无限循环。

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

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

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

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

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

    希望这有帮助。

答案 2 :(得分:12)

检查您是否只与主线程上的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];
    }
});

答案 3 :(得分:9)

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

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

答案 4 :(得分:8)

如果viewDidLoad中包含以下行,则可能会导致出现此消息。评论以下一行。

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

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

答案 5 :(得分:7)

经过几次测试后,最重要的规则是:“在动画解雇或动画节目之前不要动画。”

例如:

  • 在代理回调-dismissModalViewControllerAnimated:YES UIAlertView -alertView: will后不要致电DismissWithButtonIndex:(等待淡出警报视图后再进行操作这使用-alertView: did DismissWithButtonIndex:回调)
  • 在视图控制器显示在屏幕上之前,不要尝试显示键盘(becomeFirstResponder)。

可能会发生不好的事情。

希望它有用; - )

答案 6 :(得分:5)

您已完成[textfield becomeFirstResponder];

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

答案 7 :(得分:5)

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

textField成为MyViewControllerUIViewController的子类)的实例变量。

[textField becomeFirstResponder](针对initWithNibName:bundle:的子类)或UIViewController(针对initWithStyle:的子类)中调用UITableViewController,而不是viewDidLoad }。 E.g:

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

或者,在初始化之后但在推送UIViewController之前调用它。 E.g:

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

答案 8 :(得分:4)

如果您正在运行当前的iPhone模拟器4.0,则在旋转屏幕时(或在旋转屏幕后设置动画时)会出现此错误消息,并伴有动画中1-2秒的延迟。

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

答案 9 :(得分:3)

答案 10 :(得分:3)

覆盖viewDidappear,而不是viewWillAppear

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

答案 11 :(得分: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文件中,我的问题就解决了。也许其他情况也是如此?

答案 12 :(得分:1)

还有UIAlertView。对我来说解决这个问题的原因是如下所述,就像前面提到的仓库一样。

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

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

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

答案 13 :(得分:1)

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

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

添加UIAlertView时,框架需要引用父视图。但是如果你在viewWillAppear或viewDidLoad中,视图实际上并没有显示......你应该考虑将代码移动到viewDidAppear,UIAlertView可以使用该视图。

答案 14 :(得分:0)

解决方案在这里!

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

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

答案 15 :(得分:0)

Alertview或actionsheets应该显示在主线程上...所以如果你进行任何同步连接并在另一个线程上执行该操作并根据你从该操作收到的输出showin警告,那么你将收到此错误消息wait_fences :未收到回复:10004003。你可以做点像......

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

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

答案 16 :(得分:0)

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

答案 17 :(得分:0)

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