"Wait_fences: yanıt alınamadı: 10004003"?


94

Bu şifreli hatayı ilk kez (ve yalnızca ilk kez) aşağıdaki kod satırı nedeniyle görünümüm yüklendiğinde alıyorum:

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

Uygulamamın tepkisiz hissetmesine neden olan gözle görülür (simülatörde bile ~ 3-4 saniye) bir gecikme var. Bunu nasıl düzelteceğini bilen var mı? Apple'ın sitesinde veya burada veya Google'da herhangi bir çözümle ilgili herhangi bir belge bulamıyorum.

Garip bir şekilde, -viewDidAppear:bunun yerine satırı koyarsam tersi durum olur -viewWillAppear:; yerine hatayı klavye daha asla gösterilen ve sadece ilk seferde baskı olduğunu, hata olduğunu değil ilk kez ama sonra her defasında baskılı. Bu benim için büyük bir baş ağrısına neden oluyor.

Yanıtlar:


103

Geçersiz kıl -viewDidAppear:, değil -viewWillAppearve aramayı unutma [super viewDidAppear:]. Ekranda değilken animasyon yapmamalısınız ("görünecek"). Ve -viewDidAppear:dokümanlar, superyapacakları işleri olduğu için aramanız gerektiğini açıklıyor .


Bu istediğim kadar yanıt vermiyor (her seferinde klavyeyi göstermede hala küçük bir gecikme var), ancak hile yapıyor gibi görünüyor.
Michael

1
Bahsettiğiniz gecikmeyi biliyorum. Bunu birçok uygulamada gördüm. -BecomeFirstResponder'ı aramadan önce (sonra değil) - [süper viewDidAppear:] aramayı deneyebilirsiniz. Bunun bir etkisi olmayabilir, ancak animasyonu bir sonraki değil aynı olay döngüsünde başlatabilir. Bunu doğrulamak için henüz denemedim.
Rob Napier

14
Bu sorunu çözmez. ViewDidAppear'da bir UIAlertSheet'i atarsanız, [super viewDidAppear: animated] 'ı çağırdıktan sonra, her seferinde aynı mesajı alırsınız. Ancak, daha sonra bir ibaction'a cevaben onu atarsanız, sorun yok. yani performWithSelector muhtemelen düzeltmenin yoludur veya mesajı yok sayabilirsiniz, her iki durumda da bu kodunuzla ilgili bir sorun değil, bir SDK hatası olarak görünür.
Billy Gray

9
@Billy, animasyonlar yapılmadan önce bir UIAlertSheet atmak muhtemelen aynı soruna neden olacaktır. Her durumda, viewDidAppear'ın içine bir sayfa koyuyorsanız muhtemelen çok erken ve UIAlertSheet'i bir sonraki döngüye göndermek için muhtemelen performSelector: afterDelay: kullanmanız gerekir. Bu, SDK'da bir hata değildir, ancak buradaki ayrıntılar yeterince belgelenmemiştir. -ViewWillAppear'da animasyonlar gerçekleştirmek, orijinal koddaki hataydı. Her iki durumda da mesajı görmezden gelmemelisiniz. Garip görsel yapılara (animasyonun garip bir yana doğru kaymasına) yol açabilir.
Rob Napier


22

Hemen benzer bir hata alıyordum:

  1. Modal bir görünümü reddetme
  2. Ana görünümü güncelleme
  3. Yeni bir modal görünüm sunma

Cihazda değil sadece simülatörde aldığımı fark ettim. Ek olarak, sonsuz bir döngüye yakalanmıştım.

Benim çözümüm, yeni modal görünümün sunumunu geciktirmekti. Görünüşe göre görünüm hiyerarşisini hızla güncellemek, Apple'ın kodunda bir takım yarış koşullarına neden oldu.

Bunu aklınızda tutarak şunu deneyin:

     - (void)viewDidAppear:(BOOL)animated{

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

Henüz ekranda olmayan bir UITextField için klavyeyi sunarken sorun yaşıyor olabilirsiniz. Bu benimkine benzer sorunlara neden olabilir.

Ayrıca, her ihtimale karşı, klavyeyi sunmadan önce hiyerarşiye güncellenmesi için zaman tanımayı duraklatırsınız.

Bu yardımcı olur umarım.


3
Modallerle ilgili yaşadığınız sorunlar için, yeni modeli sunmadan önce modalın kapatılmasının bitmesini beklediniz mi? Keyfi bir süre beklemek ve tamamlanmasını ummak yerine, modalViewController'da -viewDidDisappear'ı geçersiz kılarak öğrenebilirsiniz. Bu, modelin -parentViewController'ını geri çağırabilir veya bir bildirim gönderebilir. İşin püf noktası, bir şeyin reddedilmesini istemenin onun henüz gittiği anlamına gelmediğini ve genel olarak olayları birbirinin üstüne canlandırmamalısınız. -viewWill / DidDisappear, bir şeylerin ne zaman gerçekleştiğinden emin olmanın genellikle en iyi yoludur.
Rob Napier

İlk kalıcı görünüm fotoğraf seçiciydi ve her şeyi fotoğraf seçici geri arama yöntemiyle hallediyorum. Hakkınız, viewDdiAppear içindeki bir sonraki modal görünümü başlatmak için kodu yerleştirmeliydim. bu daha iyi bir çözümdür ve büyük olasılıkla platformdan bağımsız olarak sorunu çözecektir.
Corey Floyd

12

Yalnızca ana iş parçacığı üzerindeki kullanıcı arayüzü ile etkileşimde olduğunuzu kontrol edin. Ben var wait_fences: failed to receive reply: 10004003ben ilgili kod, bir arka plan iş parçacığı üzerinde çalıştırıldı çünkü UIAlertView 5 hakkında saniye gelmesini bekledik orada otururken. Kodunuzu bloğa koyarak ve ana iş parçacığına göndererek emin olabilirsiniz:

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

Google'da bulabildiğim her şeyi denedikten sonra hiçbiri çalışmıyor, bu benim için sorunu çözen şeydi. İşin püf noktası, bu şeyleri willDismissWithButtonIndex temsilci yönteminde yapıyorum. Bunu başka bir yerde yapmadan önce.

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

8

ViewDidLoad'da aşağıdaki satıra sahipseniz, bu mesaja neden olabilir. Aşağıdaki satırı yorumlayın.

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

(Durum çubuğunu bunun yerine uygulama plist dosyasından devre dışı bırakabilirsiniz).


7

Birkaç testten sonra büyük kural şudur: "Animasyonlu kapatmadan veya animasyonlu gösteriden önce animasyon gerçekleştirmeyin."

Örneğin:

  • bir -dismissModalViewControllerAnimated:YESdelegasyon geri aramasından sonra arama yapma (geri aramayı kullanarak bunu yapmadan önce uyarı görünümünün kaybolmasını bekleyin )UIAlertView -alertView:willDismissWithButtonIndex:-alertView:didDismissWithButtonIndex:
  • becomeFirstResponderGörüntü denetleyiciniz ekrana gelmeden klavyeyi ( ) göstermeye çalışmayın .

Kötü şeyler olabilir.

Umarım faydalı olur ;-)


ClickedButtonAtIndex kullanıyordum ve uyarı görünümü kapatılmadan önce bir dizi metin alanı dolduracaktım. DidDismissWithButtonIndex olarak değiştirmek kesinlikle bu uyarılardan kurtulmaya yardımcı oldu! Teşekkürler!
Nitin Alabur

5

Bu, klavyenin animasyon veya gecikme olmadan anında kendini göstermesini sağlamam için çalıştı.

Izin textFieldvermek bir örnek değişkeni MyViewController(bir alt sınıfı UIViewController) olsun.

Çağrı [textField becomeFirstResponder]içinde initWithNibName:bundle:(bir alt sınıf için UIViewController) ya da initWithStyle:(bir alt sınıf için UITableViewControllerdeğil, içinde) viewDidLoad. Örneğin:

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

Veya, başlattıktan hemen sonra ama UIViewController. Örneğin:

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

İlginç. Bunun her zaman işe yaradığından emin misin? Endişem, referans vermemeniz view, bu yüzden uç dosyasının yüklendiğinden emin değil. Bir textFieldIBOutlet ise, bu noktada sıfır olacağını düşünürdüm.
Rob Napier

5

Yaptın [textfield becomeFirstResponder];

Ve kodunuzdaki textfield değerini aldıktan sonra yapın [textfield resignFirstResponder];. Bunun size yardımcı olacağını düşünüyorum.


4

Mevcut iPhone Simulator 4.0'ı çalıştırıyorsanız, bu hata mesajı, animasyonlarda 1-2 saniyelik gecikme ile birlikte ekran döndürülürken (veya ekranı döndürdükten sonra animasyon yapılırken) sık sık görüntülenir.

Simülatörün bu sürümündeki bir hatadır ve yakında düzeltilmesi gerekir.


iOS4 simülatör hatası hakkında bilgi için teşekkürler. aynı proje için wait_fencesmesaj 3.1 simülatöründe
görünmedi

3

Yardımın için teşekkürler, ama maalesef sorunuma o sayfada bir çözüm bulamıyorum. "Bir alt görünüm (örn. UIAlertView), üst / süper görünümünden önce oluşturulduğunda ortaya çıkıyor gibi görünüyor." Yukarıdaki kodda bu olmamalı, değil mi?
Michael

3

geçersiz kıl viewDidappear, değil viewWillAppear:

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

3

Bu UIAlertView kodu ile bu bire bir simüle edebilirim.

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

NSLocalizedString, Localizable.strings dosyasında tanımlanmadığında, metinlerin aranması uzun sürecektir, bu nedenle uyarı gösterilecek ve "wait_fences: yanıt alınamadı: 10004003" gösterilecektir.

Benim için metinleri Localizable.strings dosyalarına eklemem gerekiyordu ve sorunlarım çözüldü. Belki bu başka olaylar için de geçerlidir?


1

Ayrıca UIAlertView ile. Bunu benim için çözen şey, daha önce de belirttiğimiz gibi, aşağıdaki gibi istifa etmekti.

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

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

UIAlertViewDelegate'in diğer temsilcileri sorunu çözmedi.


1

Sorun, Apple'ın kodunda bir yarış durumu olması. Genellikle bunun yanlış kullanıcı arayüzü güncellemeleriyle bir ilgisi vardır.

Tecrübelerime göre, ya super'i viewDidAppear, viewWillAppear vs.'de çağırmadınız ya da viewDidLoad ya da viewWillAppear'da bir UIAlertView görüntülemeye çalıştınız.

Bir UIAlertView eklediğinizde, çerçevenin ana görünümünüze bir başvuruya ihtiyacı vardır. Ancak, viewWillAppear veya viewDidLoad içindeyseniz, görünüm gerçekte görüntülenmez ... Kodu, görünümün UIAlertView tarafından kullanılmaya hazır olduğu viewDidAppear'a taşımayı düşünmelisiniz.


0

Metin Alanı bu görünümün içinde mi yoksa başka bir şeyin içinde mi? "İlkRepsonder ol" u yalnızca doğrudan o görünümde bulunan bir şeye gönderebilirsiniz. Başka bir widget bileşeninde depolanmışsa, ilk yanıtlayıcı durumunu bu widget'ta ayarlamamalı, bunun yerine oluşturulan widget'ta ayarlamalısınız. Örneğin, metin alanını bir uyarı görünümüne ekliyorsanız, gösteri eşzamansız olarak gerçekleştiği için, haleFirstResponder'ı çağırdığınız zaman başlamayabilir. (İdeal olarak, kendi uyarı görünümü sınıfınız olur ve metin alanını bu sınıfta tanımlarsınız ve bu görünüm viewDidAppear'ı aldığında, metin alanını o noktada ilk yanıt veren olarak ayarlarsınız.)


0

Ayrıca mesajı alıyorum wait_fences: failed to receive reply: 10004003ve benim viewWill...ve viewDid...yöntemlerim mesaj göndermekten başka bir şey yapmıyor super. Benim durumumda UIAlertView, benim bir gösterim olduğunda GameViewControllerve kullanıcı bunun yerine iPhone yuvarlak cihaz düğmesine bastığında ve ardından uygulamaya döndüğünde oluyor. Bu benim elimde değil.


0

Uyarı görünümü veya işlem sayfaları ana iş parçacıklarında gösterilmelidir ... bu nedenle, herhangi bir eşzamanlı bağlantı yapıyorsanız ve bu işlemi başka bir iş parçacığında gerçekleştiriyorsanız ve bu işlemden aldığınız çıktıya göre uyarıları gösteriyorsanız, bu hata iletisini alırsınız. Wait_fences: başarısız oldu cevap almak: 10004003. Şunun gibi bir şey yapabilirsiniz ...

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

ve çıktı yanıt dizesini parametre olarak ileten handleOutput yönteminde uyarıları gösterin.


0

Çözüm burada!

Aynı hatayı yaptım, şimdi çözümü aldım, bu size yardımcı olabilir.

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
  [self performSelector:@selector(YOUR_METHOD) withObject:nil afterDelay:0.1];
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.