web-dev-qa-db-ger.com

"wait_fences: Antwort nicht erhalten: 10004003"?

Ich bekomme diesen kryptischen Fehler beim ersten Mal (und nur beim ersten Mal), weil meine Ansicht aufgrund der folgenden Codezeile geladen wird:

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

Es gibt eine spürbare Verzögerung (~ 3 - 4 Sekunden, selbst auf dem Simulator), die dazu führt, dass sich meine App nicht anspricht. Weiß jemand, wie man das beheben kann? Ich kann keine Dokumentation auf der Apple-Website oder Lösungen hier oder bei Google finden.

Seltsamerweise passiert die umgekehrte Situation, wenn ich die Zeile in -viewDidAppear: anstelle von -viewWillAppear: setze. Das heißt, anstatt den Fehler nur beim ersten Anzeigen der Tastatur zu drucken und nie wieder, wird der Fehler nicht beim ersten Mal, aber jedes Mal danach gedruckt. Das macht mir große Kopfschmerzen.

94
Michael

Überschreiben Sie -viewDidAppear:, nicht -viewWillAppear, und stellen Sie sicher, dass Sie [super viewDidAppear:] aufrufen. Sie sollten keine Animationen ausführen, wenn Sie nicht auf dem Bildschirm sind ("erscheint"). Und die -viewDidAppear:-Dokumente erklären, dass Sie super aufrufen müssen, da sie ihre eigenen Aufgaben haben.

104
Rob Napier

Ich bekam einen ähnlichen Fehler, als schnell:

  1. Eine modale Ansicht verwerfen 
  2. Aktualisieren Sie die Hauptansicht 
  3. Darstellen einer neuen modalen Ansicht

Ich bemerkte, dass ich es nur im Simulator und nicht auf dem Gerät bekam. Außerdem geriet ich in eine Endlosschleife.

Meine Lösung bestand darin, die Präsentation der neuen modalen Ansicht zu verzögern. Es hat den Anschein, dass das schnelle Aktualisieren der Ansichtshierarchie im Code von Apple einige Rassenbedingungen verursacht hat. 

Probieren Sie dies aus:

     - (void)viewDidAppear:(BOOL)animated{

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

Möglicherweise haben Sie Probleme bei der Darstellung der Tastatur für ein UITextField, das noch nicht auf dem Bildschirm angezeigt wird. Dies kann ähnliche Probleme wie ich verursachen.

Sie unterbrechen die Aktualisierung der Hierarchiezeit, bevor die Tastatur angezeigt wird. 

Hoffe das hilft.

22
Corey Floyd

Überprüfen Sie, ob Sie nur mit der Benutzeroberfläche des Hauptthreads interagieren. Ich habe wait_fences: failed to receive reply: 10004003 erhalten, während ich dort saß und etwa 5 Sekunden lang auf die Anzeige eines UIAlertView wartete, da der entsprechende Code in einem Hintergrundthread ausgeführt wurde. Sie können dies sicherstellen, indem Sie Ihren Code blockieren und an den Haupt-Thread senden:

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

Nachdem ich alles ausprobiert hatte, was ich bei Google finden konnte und nichts davon funktionierte, löste es das Problem für mich. Der Schlüssel ist, dass ich dieses Zeug in der Delegate-Methode willDismissWithButtonIndex mache. Bevor ich es anderswo gemacht habe.

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

Wenn Sie in viewDidLoad die folgende Zeile haben, kann diese Nachricht ausgelöst werden. Kommentieren Sie die folgende Zeile.

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

(Sie können stattdessen die Statusleiste in der Anwendungsplistendatei deaktivieren).

8
rlcoder

Nach wenigen Tests lautet die Hauptregel: "Keine Animationen vor animierter Entlassung oder animierter Show durchführen.".

Zum Beispiel:

  • rufen Sie nicht -dismissModalViewControllerAnimated:YES nach dem Delegierungscallback eines UIAlertView -alertView:willDismissWithButtonIndex: auf (warten Sie, bis die Warnanzeige ausgeblendet ist, bevor Sie dies mit dem -alertView:didDismissWithButtonIndex: callback durchführen)
  • versuchen Sie nicht, die Tastatur (becomeFirstResponder) anzuzeigen, bevor der View Controller angezeigt wird.

Schlechte Dinge können passieren.

Hoffe es wird nützlich sein ;-)

7
nverinaud

Dies funktionierte für mich so, dass sich die Tastatur sofort ohne Animation oder Verzögerung zeigte.

Sei textField eine Instanzvariable von MyViewController (eine Unterklasse von UIViewController).

Rufen Sie [textField becomeFirstResponder] in initWithNibName:bundle: (für eine Unterklasse von UIViewController) oder initWithStyle: (für eine Unterklasse von UITableViewController) auf, nicht in viewDidLoad. Z.B.:

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

Oder rufen Sie es kurz nach der Initialisierung auf, bevor Sie die Variable UIViewController drücken. Z.B.:

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

Sie haben [textfield becomeFirstResponder]; getan

Nachdem Sie den Wert aus dem Textfeld in Ihrem Code erhalten haben, führen Sie [textfield resignFirstResponder]; aus. Das wird dir helfen, denke ich.

5
Gani

Wenn Sie den aktuellen iPhone Simulator 4.0 ausführen, wird diese Fehlermeldung häufig angezeigt, wenn Sie den Bildschirm drehen (oder animieren, nachdem Sie den Bildschirm gedreht haben) und die Animationen 1-2 Sekunden verzögern.

Es ist ein Fehler in dieser Version des Simulators und sollte bald behoben werden.

4
Matt Gallagher
3
Andrew Johnson

Mit diesem UIAlertView-Code kann ich dieses Eins-zu-Eins-Modell simulieren.

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

Wenn die NSLocalizedString-Datei nicht in der Localizable.strings-Datei definiert ist, dauert die Suche nach den Texten, so dass die Warnung angezeigt wird und die Meldung "wait_fences: failed: 10004003" angezeigt wird.

Für mich musste ich nur die Texte zu den Localizable.strings-Dateien hinzufügen und meine Probleme wurden gelöst. Vielleicht ist dies auch bei anderen Vorkommnissen der Fall?

3
Vincent

Überschreiben Sie viewDidappear, nicht viewWillAppear:

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

Auch mit der UIAlertView. Was für mich gelöst wurde, war der Rücktritt wie unten erwähnt, wie die Lagerhausabstiege bereits erwähnt hatten.

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

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

Die anderen Delegierten von UIAlertViewDelegate haben das Problem nicht behoben.

1
Marcus

Das Problem ist, dass in Apples Code eine Race-Bedingung vorliegt. Normalerweise hat dies etwas mit falschen Aktualisierungen der Benutzeroberfläche zu tun.

Meiner Erfahrung nach haben Sie entweder das Super nicht in ViewDidAppear, ViewWillAppear usw. aufgerufen. Oder Sie versuchen, eine UIAlertView in ViewDidLoad oder ViewWillAppear anzuzeigen.

Wenn Sie eine UIAlertView hinzufügen, benötigt das Framework einen Verweis auf Ihre übergeordnete Ansicht. Wenn Sie sich jedoch in viewWillAppear oder viewDidLoad befinden, wird die Ansicht nicht wirklich angezeigt ... Sie sollten den Code in viewDidAppear verschieben, wo die Ansicht von UIAlertView verwendet werden kann.

1
SmallChess

Lösung ist da!

Ich hatte den gleichen Fehler, jetzt habe ich die Lösung, dies kann Ihnen helfen.

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

Ist das Textfeld in dieser Ansicht oder in etwas anderem enthalten? Sie können den 'becomeFirstRepsonder' nur an etwas senden, das direkt in dieser Ansicht enthalten ist. Wenn es in einer anderen Widgetkomponente gespeichert ist, sollten Sie nicht den Status des ersten Responders in diesem Widget festlegen, sondern eher in dem Widget, das gerade erstellt wird. Wenn Sie z. B. das Textfeld zu einer Warnmeldungsansicht hinzufügen, ist die Show nicht asynchron, wenn Sie den Auftritt von becomeFirstResponder aufrufen. (Idealerweise würden Sie über eine eigene Alert-Ansichtsklasse verfügen und das Textfeld darin definieren. Wenn That view den viewDidAppear empfängt, müssen Sie das Textfeld an dieser Stelle als Ersthelfer festlegen.)

0
AlBlue

Ich erhalte auch die Nachricht wait_fences: failed to receive reply: 10004003 und meine viewWill...- und viewDid...-Methoden tun nichts anderes, als Nachrichten an super zu senden. In meinem Fall geschieht dies, wenn eine UIAlertView in meiner GameViewController angezeigt wird und der Benutzer stattdessen die iPhone-Rundschaltfläche drückt und zur App zurückkehrt. Das sieht aus meinen Händen.

0
SK9

Alertview oder Actionheets sollten in Haupt-Threads angezeigt werden. Wenn Sie also synchrone Verbindungen herstellen und diese Operation in einem anderen Thread ausführen und Alarme auf der Grundlage der von dieser Operation erhaltenen Ausgabe anzeigen, wird diese Fehlermeldung wait_fences: fehlgeschlagen Antwort erhalten: 10004003. Du kannst so etwas machen ....

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

und zeigen Sie Warnungen in der handleOutput-Methode an, wobei Sie die Ausgabe-Antwortzeichenfolge als Parameter übergeben.

0
Vishal Singh