web-dev-qa-db-fra.com

"wait_fences: échec de la réponse: 10004003"?

J'obtiens cette erreur cryptique la première fois (et seulement la première fois), mon affichage est chargé en raison de la ligne de code suivante:

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

Il y a un retard perceptible (~ 3 à 4 secondes, même sur le simulateur) qui rend mon application insensible. Est-ce que quelqu'un sait comment réparer ceci? Je ne trouve aucune documentation à ce sujet sur le site Apple, ni aucune solution ici ou sur Google.

Curieusement, la situation inverse se produit si je mets la ligne dans -viewDidAppear: au lieu de -viewWillAppear:; c'est-à-dire qu'au lieu d'imprimer l'erreur uniquement la première fois que le clavier est affiché et plus jamais, l'erreur est non imprimée la première fois mais à chaque fois par la suite. Cela provoque un mal de tête majeur pour moi.

94
Michael

Remplacez -viewDidAppear: et non -viewWillAppear et veillez à appeler [super viewDidAppear:]. Vous ne devez pas exécuter d'animation lorsque vous n'êtes pas à l'écran ("apparaîtra"). Et les documents -viewDidAppear: expliquent que vous devez appeler super car ils ont leurs propres tâches à effectuer.

104
Rob Napier

Je recevais une erreur similaire quand rapidement:

  1. Rejeter une vue modale 
  2. Mise à jour de la vue principale 
  3. Présenter une nouvelle vue modale

J'ai remarqué que je l'obtenais seulement dans le simulateur et non sur l'appareil. De plus, je me suis retrouvé pris dans une boucle infinie.

Ma solution a été de retarder la présentation de la nouvelle vue modale. Il semble que la mise à jour rapide de la hiérarchie des vues ait provoqué quelques problèmes de concurrence dans le code d’Apple. 

Dans cet esprit, essayez ceci:

     - (void)viewDidAppear:(BOOL)animated{

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

Vous rencontrez peut-être des problèmes pour présenter le clavier d'un UITextField qui n'est pas encore affiché à l'écran. Cela peut causer des problèmes similaires au mien.

En outre, vous mettez en pause, le temps de mettre à jour la hiérarchie avant de présenter le clavier, juste au cas où. 

J'espère que cela t'aides.

22
Corey Floyd

Vérifiez que vous n'interagissez qu'avec l'interface utilisateur sur le fil principal. J'ai eu wait_fences: failed to receive reply: 10004003 alors que j'étais assis, attendant qu'un UIAlertView s'affiche pendant environ 5 secondes, car le code correspondant a été exécuté sur un fil de fond. Vous pouvez vous en assurer en mettant votre code en bloc et en l'envoyant au 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];
    }
});
12
diachedelic

Après avoir essayé tout ce que je pouvais trouver sur Google et que rien ne fonctionnait, voici ce qui a résolu le problème pour moi. La clé est que je fais ce genre de choses dans la méthode déléguée willDismissWithButtonIndex. Avant je le faisais ailleurs.

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

Si vous avez la ligne suivante dans viewDidLoad, cela peut provoquer ce message. Commentez la ligne suivante.

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

(Vous pouvez à la place désactiver la barre d'état à partir du fichier plist de l'application).

8
rlcoder

Après quelques tests, la règle générale est la suivante: "Ne réalisez pas d’animation avant un renvoi ou un spectacle animé".

Par exemple:

  • ne pas appeler -dismissModalViewControllerAnimated:YES après le rappel de délégation d'un UIAlertView -alertView:willDismissWithButtonIndex: (attendre le fondu de la vue des alertes avant de le faire en utilisant le -alertView:didDismissWithButtonIndex:
  • n'essayez pas d'afficher le clavier (becomeFirstResponder) avant que votre contrôleur de vue ne soit affiché à l'écran.

De mauvaises choses peuvent arriver.

J'espère que ça vous sera utile ;-)

7
nverinaud

Cela a fonctionné pour moi pour que le clavier se montre immédiatement, sans animation ni délai.

Soit textField une variable d'instance de MyViewController (une sous-classe de UIViewController).

Appelez [textField becomeFirstResponder] dans initWithNibName:bundle: (pour une sous-classe de UIViewController) ou initWithStyle: (pour une sous-classe de UITableViewController), pas dans viewDidLoad. Par exemple.:

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

Ou appelez-le juste après l’initialisation mais avant d’appuyer sur la variable UIViewController. Par exemple.:

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

Vous avez terminé [textfield becomeFirstResponder];

Et après avoir obtenu la valeur de textfield dans votre code, faites [textfield resignFirstResponder];. Cela vous aidera, je pense.

5
Gani

Si vous exécutez l'iPhone Simulator 4.0 actuel, ce message d'erreur apparaît fréquemment lorsque vous faites pivoter l'écran (ou lorsque vous animez une animation après l'avoir fait pivoter) accompagné d'un délai de 1-2 secondes dans les animations.

Il s’agit d’un bogue dans cette version du simulateur et devrait être corrigé prochainement.

4
Matt Gallagher
3
Andrew Johnson

Je peux simuler ce face à face au moyen de ce code UIAlertView.

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

Lorsque les chaînes NSLocalizedString ne sont pas définies dans le fichier Localizable.strings, il faudra beaucoup de temps pour rechercher les textes. L'alerte s'affichera et le message «wait_fences: failed to receive reply: 10004003» s'affichera.

Pour moi, je n'ai eu qu'à ajouter les textes aux fichiers Localizable.strings et mes problèmes ont été résolus. Peut-être est-ce également le cas pour d'autres événements?

3
Vincent

remplacer viewDidappear, pas viewWillAppear:

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

Aussi avec le UIAlertView. Ce qui a résolu le problème pour moi a été de démissionner comme ci-dessous, comme Warehouselabs mentionné précédemment.

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

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

Les autres délégués de UIAlertViewDelegate n'ont pas résolu le problème.

1
Marcus

Le problème est qu'il y a une condition de concurrence dans le code d'Apple. Généralement, cela a quelque chose à voir avec les mises à jour incorrectes de l'interface utilisateur.

D'après mon expérience, vous pouvez ne pas appeler le super dans viewDidAppear, viewWillAppear, etc. Ou vous essayez d'afficher un UIAlertView dans viewDidLoad ou viewWillAppear.

Lorsque vous ajoutez un UIAlertView, le framework nécessite une référence à votre vue parent. Mais si vous êtes dans viewWillAppear ou viewDidLoad, la vue n'est pas réellement affichée ... Vous devez envisager de déplacer le code vers viewDidAppear lorsque la vue est prête à être utilisée par UIAlertView.

1
SmallChess

La solution est là!

J'ai eu la même erreur, maintenant j'ai la solution, cela peut vous aider.

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

Le champ de texte est-il contenu dans cette vue ou dans quelque chose d'autre? Vous pouvez uniquement envoyer le message 'deviennentFirstRepsonder' à quelque chose qui est contenu directement dans cette vue. S'il est stocké dans un autre composant de widget, vous ne devez pas définir le statut de premier répondant dans ce widget, mais plutôt dans le widget en cours de création. Par exemple, si vous ajoutez le champ de texte à une vue d'alerte, étant donné que l'émission se déroule de manière asynchrone, il est possible qu'elle ne soit plus active au moment où vous appelez le devenant (firstFesResponder). (Idéalement, vous auriez votre propre classe de vue d'alerte et définiriez le champ de texte à l'intérieur de celle-ci, et lorsque that view recevrait viewDidAppear, vous définiriez le champ de texte comme premier intervenant à ce stade.)

0
AlBlue

Je reçois également le message wait_fences: failed to receive reply: 10004003 et mes méthodes viewWill... et viewDid... ne font qu'envoyer des messages à super. Dans mon cas, cela se produit lorsque j'ai une UIAlertView dans ma GameViewController et que l'utilisateur appuie à la place sur le bouton d'appareil rond de l'iPhone, puis revient à l'application. Cela a l'air de mes mains.

0
SK9

Alertview ou les feuilles d'actions doivent être affichés sur les threads principaux ... donc si vous établissez des connexions synchrones et effectuez cette opération sur un autre thread et affichez des alertes sur la base du résultat obtenu de cette opération, vous obtiendrez ce message d'erreur recevoir une réponse: 10004003. Vous pouvez faire quelque chose comme ....

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

et affichez les alertes dans la méthode handleOutput en transmettant la chaîne de réponse en sortie en tant que paramètre.

0
Vishal Singh