“Wait_fences: não recebeu resposta: 10004003”?

Eu recebo este erro críptico na primeira vez (e apenas na primeira vez), minha visão é carregada devido à seguinte linha de código:

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

Há um atraso perceptível (~ 3 – 4 segundos, mesmo no simulador) devido a isso que faz meu aplicativo não responder. Alguém sabe como consertar isso? Não consigo encontrar qualquer documentação sobre isso no site da Apple, ou quaisquer soluções aqui ou no Google.

Estranhamente, a situação oposta acontece se eu colocar a linha em -viewDidAppear: vez de -viewWillAppear: ou seja, em vez de imprimir o erro apenas na primeira vez em que o teclado é mostrado e nunca mais, o erro não é impresso na primeira vez, mas sempre depois disso. Isso está causando uma grande dor de cabeça para mim.

Override -viewDidAppear: -viewWillAppear não -viewWillAppear , e certifique-se de chamar [super viewDidAppear:] . Você não deve executar animações quando não estiver na canvas (“aparecerá”). E o -viewDidAppear: docs explicam que você deve chamar super porque eles têm suas próprias coisas para fazer.

Eu estava recebendo um erro semelhante quando rapidamente:

  1. Dispensando uma visão restrita
  2. Atualizando a visão principal
  3. Apresentando uma nova visão modal

Percebi que só estava recebendo no simulador e não no dispositivo. Além disso, eu estava sendo pego em um loop infinito.

Minha solução foi atrasar a apresentação da nova visão modal. Parece que a atualização rápida da hierarquia de visualizações causou uma certa condição de corrida no código da Apple.

Com isso em mente, tente isto:

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

Você pode estar tendo problemas ao apresentar o teclado para um UITextField que ainda não está na canvas. Isso pode estar causando problemas semelhantes aos meus.

Além disso, você pausa dando o tempo de hierarquia para atualizar antes de apresentar o teclado, apenas no caso.

Espero que isto ajude.

Verifique se você está interagindo apenas com a interface do usuário no thread principal. Eu tenho wait_fences: failed to receive reply: 10004003 enquanto eu estava sentado lá esperando por um UIAlertView para mostrar por cerca de 5 segundos, porque o código relevante foi executado em um segmento de fundo. Você pode ter certeza colocando seu código em bloco e enviando para o thread principal:

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

Depois de tentar tudo o que pude encontrar no Google e nada disso funcionando, foi isso que resolveu o problema para mim. A chave é que estou fazendo essas coisas no método delegado willDismissWithButtonIndex. Antes eu estava fazendo isso em outro lugar.

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

Se você tiver a seguinte linha no viewDidLoad, isso pode causar essa mensagem. Comente a seguinte linha.

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

(Você pode desativar a barra de status do arquivo plist do aplicativo).

Depois de alguns testes, a grande regra é: “Não execute animação antes de ser dispensada animada ou animada.”

Por exemplo:

  • não chamar -dismissModalViewControllerAnimated:YES após o retorno de chamada de delegação de um UIAlertView -alertView: will DismissWithButtonIndex: (aguarde o fade out da exibição de alerta antes de fazer isso usando o -alertView: did DismissWithButtonIndex: callback)
  • não tente mostrar o teclado ( becomeFirstResponder ) antes que o controlador de exibição esteja na canvas.

Coisas ruins podem acontecer.

Espero que seja util 😉

Isso funcionou para eu conseguir que o teclado se mostrasse imediatamente, sem animação ou atraso.

Deixe textField ser uma variável de instância de MyViewController (uma subclass de UIViewController ).

Chame [textField becomeFirstResponder] em initWithNibName:bundle: (para uma subclass de UIViewController ) ou initWithStyle: (para uma subclass de UITableViewController ), não em viewDidLoad . Por exemplo:

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

Ou ligue para ele logo após inicializar, mas antes de pressionar o UIViewController . Por exemplo:

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

Você fez [textfield becomeFirstResponder];

E depois de obter o valor do campo de texto em seu código, faça [textfield resignFirstResponder]; . Isso vai ajudar você, eu acho.

Se você estiver executando o iPhone Simulator 4.0 atual, essa mensagem de erro aparecerá com freqüência ao girar a canvas (ou ao animar depois de girar a canvas) acompanhada de um atraso de 1 a 2 segundos nas animações.

É um bug nesta versão do simulador e deve ser corrigido em breve.

replace viewDidappear , não viewWillAppear :

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

Eu posso simular este one-on-one por meio deste código UIAlertView.

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

Quando o NSLocalizedString não estiver definido no arquivo Localizable.strings, demorará muito para procurar os textos, portanto, o alerta será exibido e a mensagem “wait_fences: failed to receive reply: 10004003” será exibida.

Para mim, eu só tive que adicionar os textos aos arquivos Localizable.strings e meus problemas foram resolvidos. Talvez este seja também o caso de outras ocorrências?

Também com o UIAlertView. O que resolveu para mim foi ter a renúncia como abaixo, como warehouselabs mencionado anteriormente.

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

Os outros delegates do UIAlertViewDelegate não corrigiram o problema.

O problema é que há uma condição de corrida no código da Apple. Geralmente, isso tem a ver com atualizações incorretas da interface do usuário.

Na minha experiência, você não chamou o super em viewDidAppear, viewWillAppear etc. Ou você tenta exibir um UIAlertView em viewDidLoad ou viewWillAppear.

Quando você adiciona um UIAlertView, o framework precisa de uma referência à sua exibição pai. Mas se você estiver em viewWillAppear ou viewDidLoad, a exibição não será realmente exibida … Você deve considerar mover o código para viewDidAppear em que a visualização está pronta para ser usada pelo UIAlertView.

O campo de texto está contido nessa visualização ou em outra coisa? Você só pode enviar o ‘becomeFirstRepsonder’ para algo que esteja contido diretamente nessa visualização. Se estiver armazenado em algum outro componente de widget, você não deve definir o status do primeiro socorrente neste widget, mas sim no widget que está sendo criado. Por exemplo, se você estiver adicionando o campo de texto a uma exibição de alerta, como a apresentação acontece de forma assíncrona, ela pode não estar ativa até o momento em que você chama o método becomeFirstResponder. (Idealmente, você teria sua própria class de visualização de alerta e definiria o campo de texto dentro dela e, quando essa exibição receber o viewDidAppear, você definiria o campo de texto como primeiro respondedor nesse ponto.)

Eu também recebo a mensagem wait_fences: failed to receive reply: 10004003 e meus methods viewWill... e viewDid... não fazem nada além de enviar mensagens para super . No meu caso, acontece quando eu tenho um UIAlertView mostrando no meu GameViewController e o usuário pressiona o botão redondo do iPhone e depois retorna para o aplicativo. Isso parece fora das minhas mãos.

Alertview ou actionsheets devem ser mostrados nos tópicos principais … portanto, se você estiver fazendo conexões síncronas e executando essa operação em outro encadeamento e mostrando alertas com base na saída recebida dessa operação, obterá essa mensagem de erro wait_fences: failed to receber resposta: 10004003. Você pode fazer algo como ….

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

e mostra alertas no método handleOutput passando a string de resposta de saída como o parâmetro.

A solução está aqui!

Eu tive o mesmo erro, agora eu tenho a solução, isso pode ajudá-lo.

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