"Wait_fences: Antwort konnte nicht empfangen werden: 10004003"?


94

Ich erhalte diesen kryptischen Fehler beim ersten (und nur beim ersten Mal) Laden meiner Ansicht aufgrund der folgenden Codezeile:

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

Aufgrund dessen tritt eine merkliche Verzögerung (~ 3 - 4 Sekunden, sogar auf dem Simulator) auf, die dazu führt, dass sich meine App nicht mehr reagiert. Weiß jemand, wie man das behebt? Ich kann keine Dokumentation auf der Apple-Website oder Lösungen hier oder bei Google finden.

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

Antworten:


103

Überschreiben Sie -viewDidAppear:nicht -viewWillAppearund rufen Sie an [super viewDidAppear:]. Sie sollten keine Animationen ausführen, wenn Sie nicht auf dem Bildschirm sind ("wird angezeigt"). Und die -viewDidAppear:Dokumente erklären, dass Sie anrufen müssen, superweil sie ihre eigenen Dinge zu tun haben.


Dies ist nicht so reaktionsschnell wie ich es gerne hätte (es gibt immer noch eine leichte Verzögerung, wenn die Tastatur jedes Mal angezeigt wird), aber es scheint den Trick zu tun.
Michael

1
Ich kenne die Verzögerung, von der Sie sprechen. Ich habe es in vielen Apps gesehen. Sie können versuchen, -becomeFirstResponder vor (und nicht nach) dem Aufruf von - [super viewDidAppear:] aufzurufen, wenn Sie dies noch nicht getan haben. Dies hat möglicherweise keine Auswirkungen, startet jedoch möglicherweise die Animation in derselben Ereignisschleife und nicht in der nächsten. Ich habe noch nicht damit experimentiert, um dies zu bestätigen.
Rob Napier

14
Dies behebt das Problem nicht. Wenn Sie nach dem Aufruf von [super viewDidAppear: animiert] ein UIAlertSheet in viewDidAppear aufrufen, wird jedes Mal dieselbe Nachricht angezeigt. Wenn Sie es jedoch später werfen, sagen Sie als Antwort auf eine Ibaktion, kein Problem. Mit performWithSelector können Sie das Problem wahrscheinlich beheben, oder Sie können die Meldung ignorieren. In beiden Fällen scheint dies ein SDK-Fehler zu sein, kein Problem mit Ihrem Code.
Billy Gray

9
@ Billy, das Aufrufen eines UIAlertSheets vor dem Erstellen von Animationen würde wahrscheinlich das gleiche Problem verursachen. In jedem Fall ist es wahrscheinlich zu früh, ein Blatt in viewDidAppear zu erstellen, und Sie sollten performSelector: afterDelay: verwenden, um das UIAlertSheet in die nächste Schleife zu verschieben. Das ist kein Fehler im SDK, obwohl die Details hier schlecht dokumentiert sind. Das Ausführen von Animationen in -viewWillAppear war der Fehler im ursprünglichen Code. In beiden Fällen sollten Sie die Nachricht nicht ignorieren. Dies kann zu seltsamen visuellen Artefakten führen (ein seltsames seitliches Verschieben der Animation).
Rob Napier

4
@ Michael, ich habe eine LösungbecomeFirstResponder bereitgestellt , um die Tastatur sofort und ohne Verzögerung anzuzeigen .
ma11hew28

22

Ich bekam schnell einen ähnlichen Fehler:

  1. Eine modale Ansicht verwerfen
  2. Hauptansicht aktualisieren
  3. Präsentation 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 scheint, dass das schnelle Aktualisieren der Ansichtshierarchie zu einigen Rassenbedingungen im Apple-Code geführt hat.

Versuchen Sie in diesem Sinne Folgendes:

     - (void)viewDidAppear:(BOOL)animated{

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

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

Außerdem halten Sie an, um der Hierarchie Zeit zum Aktualisieren zu geben, bevor Sie die Tastatur für alle Fälle anzeigen.

Hoffe das hilft.


3
Haben Sie bei den Problemen mit Modal gewartet, bis das Modal vollständig entlassen wurde, bevor Sie das neue Modal vorgestellt haben? Anstatt eine beliebige Zeitspanne zu warten und zu hoffen, dass sie abgeschlossen ist, können Sie dies wissen, indem Sie -viewDidDisappear im modalViewController überschreiben. Dies kann zum -parentViewController des Modals zurückrufen oder eine Benachrichtigung senden. Der Schlüssel ist zu verstehen, dass das Bitten um Entlassung nicht bedeutet, dass es noch nicht weg ist, und dass Sie Dinge im Allgemeinen nicht übereinander animieren sollten. -viewWill / DidDisappear ist im Allgemeinen der beste Weg, um sicher zu wissen, wann etwas passiert.
Rob Napier

Die erste modale Ansicht war die Fotoauswahl, und ich behandle alles innerhalb der Rückrufmethode für die Fotoauswahl. Ihr Recht, ich hätte den Code platzieren sollen, um die nächste modale Ansicht in viewDdiAppear zu starten. Dies ist eine bessere Lösung und würde das Problem höchstwahrscheinlich unabhängig von der Plattform beheben.
Corey Floyd

12

Überprüfen Sie, ob Sie nur mit der Benutzeroberfläche im Hauptthread interagieren. Ich habe wait_fences: failed to receive reply: 10004003während ich dort saß und darauf gewartet, dass ein UIAlertView für ungefähr 5 Sekunden angezeigt wird, weil der relevante Code in einem Hintergrundthread ausgeführt wurde. Sie können dies sicherstellen, indem Sie Ihren Code blockieren und an den Hauptthread 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];
    }
});

9

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

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

8

Wenn in viewDidLoad die folgende Zeile angezeigt wird, kann dies zu dieser Meldung führen. Kommentieren Sie die folgende Zeile.

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

(Sie können stattdessen die Statusleiste in der Anwendungsplist-Datei deaktivieren.)


7

Nach einigen Tests lautet die große Regel: "Führen Sie keine Animation vor der animierten Entlassung oder animierten Show durch."

Beispielsweise:

  • Rufen Sie nicht -dismissModalViewControllerAnimated:YESnach dem Delegierungsrückruf von an (warten Sie, bis die Warnansicht ausgeblendet ist, bevor Sie den Rückruf verwenden).UIAlertView -alertView:willDismissWithButtonIndex:-alertView:didDismissWithButtonIndex:
  • Versuchen Sie nicht, die Tastatur ( becomeFirstResponder) anzuzeigen, bevor Ihr View Controller auf dem Bildschirm angezeigt wird.

Es können schlimme Dinge passieren.

Hoffe es wird nützlich sein ;-)


Ich habe clickedButtonAtIndex verwendet und eine Reihe von Textfeldern ausgefüllt, bevor die Alarmansicht geschlossen wurde. Das Umschalten auf didDismissWithButtonIndex hat sicherlich dazu beigetragen, diese Warnungen loszuwerden! Vielen Dank!
Nitin Alabur

5

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

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

Rufen Sie [textField becomeFirstResponder]an initWithNibName:bundle:(für eine Unterklasse von UIViewController) oder initWithStyle:(für eine Unterklasse von UITableViewController), 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, aber bevor Sie die Taste drücken UIViewController. Z.B:

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

Interessant. Sind Sie sicher, dass dies die ganze Zeit funktioniert? Ich mache mir Sorgen, dass Sie nicht referenzieren view, daher ist es nicht sicher, ob die NIB-Datei geladen wurde. Wenn textFieldes sich um ein IBOutlet handelt, würde ich denken, dass es an dieser Stelle gleich Null ist.
Rob Napier

5

Du hast gemacht [textfield becomeFirstResponder];

Und nachdem Sie den Wert aus dem Textfeld in Ihrem Code erhalten haben, tun Sie dies [textfield resignFirstResponder];. Das wird dir helfen, denke ich.


4

Wenn Sie den aktuellen iPhone Simulator 4.0 ausführen, wird diese Fehlermeldung häufig angezeigt, wenn Sie den Bildschirm drehen (oder wenn Sie nach dem Drehen des Bildschirms animieren), und die Animationen verzögern sich um 1-2 Sekunden.

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


Vielen Dank für Informationen über iOS4 Simulator Bug. für das gleiche Projekt wurde die wait_fencesNachricht nicht im 3.1-Simulator
angezeigt

3

Vielen Dank für die Hilfe, aber leider kann ich auf dieser Seite keine Lösung für mein Problem finden. "Es scheint aufzutreten, wenn eine Unteransicht (z. B. UIAlertView) vor ihrer übergeordneten / Superansicht erstellt wird." Das sollte im obigen Code nicht passieren, oder?
Michael

3

überschreiben viewDidappear, nicht viewWillAppear:

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

3

Mit diesem UIAlertView-Code kann ich dies eins zu eins 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 nicht in der Datei Localizable.strings definiert sind, dauert die Suche nach den Texten zu lange. Daher wird die Warnung angezeigt und die Meldung "wait_fences: Antwort konnte nicht empfangen werden: 10004003" angezeigt.

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 Ereignissen der Fall?


1

Auch mit dem UIAlertView. Was es für mich gelöst hat, war der Rücktritt wie unten erwähnt, wie bereits erwähnt.

- (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

Das Problem ist, dass der Apple-Code eine Race-Bedingung enthält. Normalerweise hat dies mit falschen UI-Updates zu tun.

Nach meiner Erfahrung haben Sie das Super entweder in viewDidAppear, viewWillAppear usw. nicht 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 angezeigt. Sie sollten in Betracht ziehen, den Code nach viewDidAppear zu verschieben, wo die Ansicht für die Verwendung durch UIAlertView bereit ist.


0

Ist das Textfeld in dieser Ansicht oder in etwas anderem enthalten? Sie können den 'comeFirstRepsonder' nur an etwas senden, das direkt in dieser Ansicht enthalten ist. Wenn es in einer anderen Widget-Komponente gespeichert ist, sollten Sie den Ersthelfer-Status nicht in diesem Widget festlegen, sondern in dem Widget, das erstellt wird. Wenn Sie beispielsweise das Textfeld zu einer Warnansicht hinzufügen, weil die Show asynchron erfolgt, ist sie möglicherweise nicht aktiv, wenn Sie den makeFirstResponder aufrufen. (Idealerweise verfügen Sie über eine eigene Klasse für Warnungsansichten und definieren das Textfeld darin. Wenn diese Ansicht viewDidAppear empfängt, legen Sie das Textfeld an diesem Punkt als Ersthelfer fest.)


0

Ich bekomme auch die Nachricht wait_fences: failed to receive reply: 10004003und meine viewWill...und viewDid...Methoden tun nichts anderes als Nachrichten an zu senden super. In meinem Fall passiert es, wenn ich eine UIAlertViewAnzeige in meinem habe GameViewControllerund der Benutzer stattdessen die runde iPhone-Gerätetaste drückt und dann zur App zurückkehrt. Das sieht aus meinen Händen.


0

Warnungsansicht oder Aktionsblätter sollten in Hauptthreads angezeigt werden. Wenn Sie also synchrone Verbindungen herstellen und diese Operation in einem anderen Thread ausführen und Warnungen auf der Grundlage der Ausgabe anzeigen, die Sie von dieser Operation erhalten haben, wird die Fehlermeldung wait_fences: failed to angezeigt Antwort erhalten: 10004003. Sie können so etwas tun wie ...

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

und zeigen Sie Warnungen in der handleOutput-Methode an, indem Sie die Ausgabeantwortzeichenfolge als Parameter übergeben.


0

Lösung ist da!

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

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
  [self performSelector:@selector(YOUR_METHOD) withObject:nil afterDelay:0.1];
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.