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.
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.
Je recevais une erreur similaire quand rapidement:
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.
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];
}
});
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];
}
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).
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:
-dismissModalViewControllerAnimated:YES
après le rappel de délégation d'un UIAlertView -alertView:
will
DismissWithButtonIndex:
(attendre le fondu de la vue des alertes avant de le faire en utilisant le -alertView:
did
DismissWithButtonIndex:
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 ;-)
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];
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.
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.
Voir ici pour plus d’informations: http://www.iphonedevsdk.com/forum/iphone-sdk-development-advanced-discussion/17373-wait_fences-failed-receive-reply-10004003-a.html
Votre problème est lié.
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?
remplacer viewDidappear
, pas viewWillAppear
:
-(void) viewDidAppear:(BOOL) animated
{
[super viewDidAppear:animated];
[myTextField becomeFirstResponder];
}
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.
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.
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];
}
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.)
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.
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.