Ten tajemniczy błąd pojawia się przy pierwszym (i tylko pierwszym) ładowaniu widoku z powodu następującego wiersza kodu:
- (void)viewWillAppear:(BOOL)animated
{
[textField becomeFirstResponder];
}
Występuje zauważalne (~ 3-4 sekundy, nawet na symulatorze) opóźnienie, które powoduje, że moja aplikacja nie reaguje. Czy ktoś wie, jak to naprawić? Nie mogę znaleźć żadnej dokumentacji w witrynie Apple, ani żadnych rozwiązań tutaj ani w Google.
O dziwo, sytuacja odwrotna ma miejsce, gdy wstawię linię -viewDidAppear:
zamiast -viewWillAppear:
; to znaczy, zamiast drukować błąd tylko przy pierwszym wyświetleniu klawiatury i nigdy więcej, błąd nie jest drukowany za pierwszym razem, ale za każdym razem. To powoduje u mnie duży ból głowy.
źródło
becomeFirstResponder
natychmiastowe wyświetlanie klawiatury .Otrzymałem podobny błąd, gdy szybko:
Zauważyłem, że dostaję to tylko w symulatorze, a nie na urządzeniu. Dodatkowo dałem się złapać w nieskończoną pętlę.
Moim rozwiązaniem było opóźnienie prezentacji nowego widoku modalnego. Wygląda na to, że szybka aktualizacja hierarchii widoków spowodowała pewne utrudnienia w kodzie Apple.
Mając to na uwadze, spróbuj tego:
- (void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; [textField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.1]; }
Możesz mieć problemy z prezentacją klawiatury dla UITextField, którego jeszcze nie ma na ekranie. Może to powodować problemy podobne do moich.
Ponadto, na wszelki wypadek, zatrzymujesz się, dając czas na aktualizację hierarchii przed prezentacją klawiatury.
Mam nadzieję że to pomoże.
źródło
Sprawdź, czy korzystasz z interfejsu użytkownika tylko w głównym wątku. Dostałem,
wait_fences: failed to receive reply: 10004003
gdy siedziałem tam i czekałem na wyświetlenie UIAlertView przez około 5 sekund, ponieważ odpowiedni kod został wykonany w wątku w tle. Możesz się upewnić, umieszczając swój kod w bloku i wysyłając go do głównego wątku: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]; } });
źródło
Po wypróbowaniu wszystkiego, co mogłem znaleźć w Google i nic z tego nie działało, właśnie to rozwiązało problem. Kluczem jest to, że robię to w metodzie delegata willDismissWithButtonIndex. Wcześniej robiłem to gdzie indziej.
- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex { [myTextField resignFirstResponder]; [myTextField removeFromSuperview]; [myTextField release]; }
źródło
Jeśli masz następujący wiersz w viewDidLoad, może to spowodować ten komunikat. Skomentuj następujący wiersz.
[[UIApplication sharedApplication] setStatusBarHidden:YES]; //This line should be commented
(Zamiast tego można wyłączyć pasek stanu w pliku plist aplikacji).
źródło
Po kilku testach podstawową zasadą jest: „Nie wykonuj animacji przed zakończeniem animacji lub pokazem animowanym”.
Na przykład:
-dismissModalViewControllerAnimated:YES
po wywołaniu zwrotnym delegacji an (poczekaj, aż zniknie widok alertu, zanim zrobisz to za pomocąUIAlertView -alertView:
will
DismissWithButtonIndex:
-alertView:
did
DismissWithButtonIndex:
zwrotnej)becomeFirstResponder
), zanim kontroler widoku nie pojawi się na ekranie.Mogą się zdarzyć złe rzeczy.
Mam nadzieję, że się przyda ;-)
źródło
Pomogło mi to, aby klawiatura wyświetlała się natychmiast, bez animacji i opóźnień.
Niech
textField
będzie zmienną instancjiMyViewController
(podklasąUIViewController
).Zadzwoń
[textField becomeFirstResponder]
nainitWithNibName:bundle:
(dla podklasyUIViewController
) lubinitWithStyle:
(dla podklasyUITableViewController
), nieviewDidLoad
. Na przykład:- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { [textField becomeFirstResponder]; } return self; }
Lub wywołaj to zaraz po inicjalizacji, ale przed wciśnięciem
UIViewController
. Na przykład:MyViewController *viewController = [[MyViewController alloc] init]; [viewController.textField becomeFirstResponder]; [self.navigationController pushViewController:viewController animated:YES]; [viewController release];
źródło
view
, więc nie ma pewności, że plik nib został załadowany. JeślitextField
jest to IBOutlet, to myślę, że w tym momencie byłby zerowy.Uczyniłeś
[textfield becomeFirstResponder];
A po uzyskaniu wartości z pola tekstowego w kodzie zrób
[textfield resignFirstResponder];
. Myślę, że to ci pomoże.źródło
Jeśli używasz obecnego symulatora iPhone'a 4.0, ten komunikat o błędzie pojawia się często podczas obracania ekranu (lub podczas animacji po obróceniu ekranu), któremu towarzyszy 1-2 sekundowe opóźnienie w animacjach.
Jest to błąd w tej wersji symulatora i powinien zostać wkrótce naprawiony.
źródło
wait_fences
komunikat nie pojawił się w symulatorze 3.1Zobacz tutaj, aby uzyskać więcej informacji: http://www.iphonedevsdk.com/forum/iphone-sdk-development-advanced-discussion/17373-wait_fences-failed-receive-reply-10004003-a.html
Twój problem jest powiązany.
źródło
nadpisać
viewDidappear
, a nieviewWillAppear
:-(void) viewDidAppear:(BOOL) animated { [super viewDidAppear:animated]; [myTextField becomeFirstResponder]; }
źródło
Mogę zasymulować ten jeden na jednego za pomocą tego kodu UIAlertView.
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"defineTitle",@"defineTitle") message:NSLocalizedString(@"defineBody", @"defineBody") delegate:self cancelButtonTitle:NSLocalizedString(@"Ok", @"Ok") otherButtonTitles:nil]; [alert show];
Jeśli ciąg NSLocalizedString nie jest zdefiniowany w pliku Localizable.strings, wyszukiwanie tekstów zajmie zbyt dużo czasu, więc pojawi się alert i zostanie wyświetlony komunikat „wait_fences: failed to get response: 10004003”.
U mnie wystarczyło tylko dodać teksty do plików Localizable.strings i moje problemy zostały rozwiązane. Może dotyczy to również innych sytuacji?
źródło
Również z UIAlertView. Rozwiązaniem dla mnie była rezygnacja jak poniżej, o czym wspomniałem wcześniej Warehouselabs.
- (void)didPresentAlertView:(UIAlertView *)alertView { [txtListingPassword becomeFirstResponder]; } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { [txtListingPassword resignFirstResponder]; }
Inni delegaci UIAlertViewDelegate nie rozwiązali problemu.
źródło
Problem polega na tym, że w kodzie Apple jest stan wyścigu. Zwykle ma to coś wspólnego z nieprawidłowymi aktualizacjami interfejsu użytkownika.
Z mojego doświadczenia wynika, że albo nie zadzwoniłeś do super in viewDidAppear, viewWillAppear itp. Lub próbujesz wyświetlić UIAlertView w viewDidLoad lub viewWillAppear.
Po dodaniu UIAlertView struktura potrzebuje odwołania do widoku nadrzędnego. Ale jeśli jesteś w viewWillAppear lub viewDidLoad, widok nie jest w rzeczywistości wyświetlany ... Należy rozważyć przeniesienie kodu do viewDidAppear, gdzie widok jest gotowy do użycia przez UIAlertView.
źródło
Czy pole tekstowe jest zawarte w tym widoku, czy w czymś innym? Możesz wysłać tylko „getFirstRepsonder” do czegoś, co jest zawarte bezpośrednio w tym widoku. Jeśli jest przechowywany w innym komponencie widżetu, nie należy ustawiać stanu pierwszej osoby odpowiadającej w tym widgecie, ale raczej w tworzonym widgecie. Na przykład, jeśli dodajesz pole tekstowe do widoku alertu, ponieważ pokaz odbywa się asynchronicznie, może nie być uruchomiony do czasu wywołania funkcji getFirstResponder. (Idealnie byłoby, gdybyś miał własną klasę widoku alertów i zdefiniował pole tekstowe w niej, a gdy ten widok otrzyma viewDidAppear, ustaw pole tekstowe jako pierwszy responder w tym momencie).
źródło
Otrzymuję również wiadomość,
wait_fences: failed to receive reply: 10004003
a mojeviewWill...
iviewDid...
metody nie robią nic poza wysyłaniem wiadomości dosuper
. W moim przypadku dzieje się tak, gdy mamUIAlertView
wyświetlanie w moim,GameViewController
a użytkownik zamiast tego naciska okrągły przycisk urządzenia iPhone'a, a następnie wraca do aplikacji. To wychodzi z moich rąk.źródło
Widok alertów lub arkusze działań powinny być wyświetlane w głównych wątkach ... więc jeśli wykonujesz połączenia synchroniczne i wykonujesz tę operację w innym wątku i wyświetlasz alerty na podstawie danych wyjściowych otrzymanych z tej operacji, otrzymasz komunikat o błędzie wait_fences: failed to otrzymać odpowiedź: 10004003. Możesz zrobić coś takiego ...
[self performSelectotOnMainThread:@selector(handleOutput:) withObject:output waitUntilDone:YES/NO];
i pokaż alerty w metodzie handleOutput przekazując wyjściowy łańcuch odpowiedzi jako parametr.
źródło
Rozwiązanie jest tutaj!
Miałem ten sam błąd, teraz mam rozwiązanie, to może ci pomóc.
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{ [self performSelector:@selector(YOUR_METHOD) withObject:nil afterDelay:0.1]; }
źródło