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

我第一次(只有第一次)我的视图被加载,由于下面的代码行得到这个神秘的错误:

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

有一个明显的(约3 – 4秒,即使在模拟器上)延迟,由于这使得我的应用程序感觉没有反应。 有谁知道如何解决这个问题? 我在苹果的网站上找不到任何文档,或者在这里或谷歌上find任何解决scheme。

奇怪的是,相反的情况发生,如果我把行在-viewDidAppear:而不是-viewWillAppear: 也就是说,不是仅在第一次显示键盘时才打印错误,而不再是第一次打印错误,而是每次打印错误。 这给我造成了很大的困扰。

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

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

  1. 驳回模态观点
  2. 更新主视图
  3. 呈现一种新的模态观点

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

我的解决办法是推迟提出新的模态观点。 看来,快速更新视图层次引起了苹果代码中的一些竞争条件。

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

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

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

此外,您暂停给出层次结构时间来更新键盘之前,以防万一。

希望这可以帮助。

检查你是只与主线程上的用户界面进行交互。 我得到了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]; } }); 

尝试了所有可以在Google上find的所有内容,但都没有成功,这就解决了我的问题。 关键是我在willDismissWithButtonIndex委托方法中做这个东西。 之前我在别的地方做。

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

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

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

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

经过几次testing,最大的规则是:“在animation解散或animation展示之前不要进行animation制作”。

例如:

  • UIAlertView -alertView:的委托callback之后,不要调用-dismissModalViewControllerAnimated:YES UIAlertView -alertView:在使用-alertView: did DismissWithButtonIndex: callback之前,等待淡出警报视图)
  • 在您的视图控制器在屏幕上之前不要尝试显示键盘( becomeFirstResponder )。

坏事可能会发生。

希望它会有用;-)

这对我来说,让键盘立即显示自己,没有animation或延迟。

textFieldMyViewControllerUIViewController的子类)的实例variables。

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

你已经完成了[textfield becomeFirstResponder];

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

如果您正在运行当前的iPhone Simulator 4.0,则在旋转屏幕(或旋转屏幕后进行animation制作)时,会出现此错误消息,伴随着1-2秒的animation滞后。

这是这个版本的模拟器中的一个错误,应该尽快解决。

有关详细信息,请参阅此处: http : //www.iphonedevsdk.com/forum/iphone-sdk-development-advanced-discussion/17373-wait_fences-failed-receive-reply-10004003-a.html

你的问题是相关的。

重写viewDidappear ,而不是viewWillAppear

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

我可以通过这个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时,将花费很长时间来search文本,因此将显示警报,并显示“wait_fences:failed to receive reply:10004003”。

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

也用UIAlertView。 为了解决这个问题,就像前面提到的仓库一样。

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

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

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

根据我的经验,你可能没有在viewDidAppear,viewWillAppear等中调用super。或者你尝试在viewDidLoad或viewWillAppear中显示一个UIAlertView。

当你添加一个UIAlertView时,框架需要一个对你的父视图的引用。 但是,如果你在viewWillAppear或viewDidLoad中,那么这个视图实际上并不显示…你应该考虑把代码移动到viewDidAppear,这个视图已经准备好被UIAlertView使用了。

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

我也收到了消息wait_fences: failed to receive reply: 10004003和我viewWill...viewDid...方法什么都不做,只是发送消息到super 。 在我的情况下,当我有一个UIAlertView显示在我的GameViewController ,用户反而按下iPhone的圆形设备button,然后返回到应用程序。 这看起来不在我手中。

Alertview或actionsheets应该显示在主线程…所以如果你做任何同步连接,并在另一个线程上执行该操作,并根据从该操作收到的输出显示警报,则会收到此错误消息wait_fences:failed to收到回复:10004003。 你可以做一些像….

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

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

解决scheme在这里!

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

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