“Wait_fences: gagal menerima balasan: 10004003”?

94

Saya mendapatkan kesalahan samar ini pertama kali (dan hanya pertama kali) tampilan saya dimuat karena baris kode berikut:

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

Ada penundaan yang nyata (~ 3 - 4 detik, bahkan di simulator) karena ini yang membuat aplikasi saya terasa tidak responsif. Apakah ada yang tahu cara memperbaikinya? Saya tidak dapat menemukan dokumentasi apa pun tentangnya di situs Apple, atau solusi apa pun di sini atau di Google.

Anehnya, situasi yang berlawanan terjadi jika saya memasukkan garis -viewDidAppear:alih-alih -viewWillAppear:; Artinya, bukannya mencetak kesalahan hanya saat pertama kali keyboard ditampilkan dan tidak pernah lagi, kesalahan tidak dicetak pertama kali tetapi setiap kali setelahnya. Ini membuat saya sangat pusing.

Michael
sumber

Jawaban:

103

Timpa -viewDidAppear:, jangan -viewWillAppear, dan pastikan untuk menelepon [super viewDidAppear:]. Anda tidak boleh melakukan animasi saat Anda tidak berada di layar ("akan muncul"). Dan -viewDidAppear:dokumen menjelaskan bahwa Anda harus menelepon superkarena mereka memiliki urusan sendiri.

Rob Napier
sumber
Ini tidak responsif seperti yang saya inginkan (masih ada sedikit penundaan saat menampilkan keyboard setiap kali), tetapi tampaknya berhasil.
Michael
1
Aku tahu lag yang kamu bicarakan. Saya telah melihatnya di banyak aplikasi. Anda dapat mencoba memanggil -becomeFirstResponder sebelum (bukan setelah) memanggil - [super viewDidAppear:] jika Anda belum melakukannya. Ini mungkin tidak berdampak, tetapi mungkin animasi dimulai di loop peristiwa yang sama daripada yang berikutnya. Saya belum bereksperimen dengan ini untuk mengonfirmasi.
Rob Napier
14
Ini tidak menyelesaikan masalah. Jika Anda memunculkan UIAlertSheet di viewDidAppear, setelah memanggil [super viewDidAppear: animated], Anda akan mendapatkan pesan yang sama, setiap saat. jika, bagaimanapun, Anda memuntahkannya setelah itu, katakan sebagai tanggapan atas suatu tindakan, tidak masalah. jadi performWithSelector mungkin adalah cara untuk memperbaikinya, atau Anda dapat mengabaikan pesan tersebut, bagaimanapun juga ini tampaknya merupakan bug SDK, bukan masalah dengan kode Anda.
Billy Gray
9
@ Billy, memunculkan UIAlertSheet sebelum animasi selesai kemungkinan besar akan menyebabkan masalah yang sama. Bagaimanapun, Anda memasang sheet di dalam viewDidAppear mungkin terlalu dini dan Anda mungkin harus menggunakan performSelector: afterDelay: untuk mendorong UIAlertSheet ke loop berikutnya. Itu bukan bug di SDK, meskipun detailnya di sini tidak terdokumentasi dengan baik. Melakukan animasi di -viewWillAppear adalah bug dalam kode aslinya. Dalam kedua kasus tersebut, Anda tidak boleh mengabaikan pesan tersebut. Hal ini dapat menyebabkan artefak visual yang aneh (animasi geser ke samping yang aneh).
Rob Napier
22

Saya mendapatkan kesalahan serupa ketika dengan cepat:

  1. Menutup tampilan modal
  2. Memperbarui tampilan utama
  3. Menyajikan tampilan modal baru

Saya perhatikan saya hanya mendapatkannya di simulator dan bukan di perangkat. Selain itu, saya terjebak dalam putaran tak terbatas.

Solusi saya adalah menunda penyajian tampilan modal baru. Tampaknya memperbarui hierarki tampilan dengan cepat menyebabkan beberapa kondisi balapan dalam kode Apple.

Dengan mengingat hal itu, coba ini:

     - (void)viewDidAppear:(BOOL)animated{

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

Anda mungkin mengalami masalah saat menyajikan keyboard untuk UITextField yang belum ada di layar. Ini mungkin menyebabkan masalah yang mirip dengan saya.

Selain itu, Anda menjeda agar hierarki diberi waktu untuk memperbarui sebelum menampilkan keyboard, untuk berjaga-jaga.

Semoga ini membantu.

Corey Floyd
sumber
3
Untuk masalah yang Anda alami dengan modals, apakah Anda menunggu modal selesai ditutup sebelum menyajikan modal baru? Daripada menunggu periode waktu yang berubah-ubah dan berharap itu selesai, Anda bisa mengetahuinya dengan mengganti -viewDidDisappear di modalViewController. Itu bisa memanggil kembali ke -parentViewController modal, atau bisa memposting notifikasi. Kuncinya adalah untuk memahami bahwa meminta sesuatu untuk diabaikan tidak berarti sudah hilang, dan Anda tidak boleh menganimasikan sesuatu di atas satu sama lain secara umum. -viewWill / DidDisappear umumnya adalah cara terbaik Anda untuk mengetahui dengan pasti kapan sesuatu terjadi.
Rob Napier
Tampilan modal pertama adalah pemilih foto, dan saya menangani semuanya dalam metode panggilan balik pemilih foto. Hak Anda, saya harus menempatkan kode untuk meluncurkan tampilan modal berikutnya dalam viewDdiAppear. itu adalah solusi yang lebih baik dan kemungkinan besar akan memperbaiki masalah apa pun platformnya.
Corey Floyd
12

Pastikan Anda hanya berinteraksi dengan UI di utas utama. Saya mendapat wait_fences: failed to receive reply: 10004003saat saya duduk di sana menunggu UIAlertView ditampilkan selama sekitar 5 detik karena kode yang relevan dieksekusi pada utas latar belakang. Anda dapat memastikan dengan meletakkan kode Anda di blok dan mengirimkannya ke utas utama:

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];
    }
});
diachedelic.dll
sumber
9

Setelah mencoba semua yang saya dapat temukan di Google dan tidak ada yang berhasil, inilah yang memecahkan masalah bagi saya. Kuncinya adalah saya melakukan hal ini dalam metode delegasi willDismissWithButtonIndex. Sebelum saya melakukannya di tempat lain.

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

Jika Anda memiliki baris berikut di viewDidLoad, itu dapat menyebabkan pesan ini. Beri komentar pada baris berikut.

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

(Anda dapat menonaktifkan bilah status dari file plist aplikasi).

rlcoder
sumber
7

Setelah beberapa pengujian, aturan besarnya adalah: "Jangan melakukan animasi sebelum animasi ditutup atau pertunjukan animasi.".

Sebagai contoh:

  • jangan panggil -dismissModalViewControllerAnimated:YESsetelah delegasi callback (tunggu fade out dari tampilan peringatan sebelum melakukan ini menggunakan callback)UIAlertView -alertView:willDismissWithButtonIndex:-alertView:didDismissWithButtonIndex:
  • jangan mencoba untuk menampilkan keyboard ( becomeFirstResponder) sebelum pengontrol tampilan Anda ada di layar.

Hal-hal buruk bisa saja terjadi.

Semoga bermanfaat ;-)

nverinaud
sumber
Saya menggunakan clickedButtonAtIndex, dan akan melakukan banyak textfield yang mengisi sebelum alertview ditutup. Mengalihkannya ke didDismissWithButtonIndex tentu membantu menghilangkan peringatan tersebut! Terima kasih!
Nitin Alabur
5

Ini berfungsi agar saya membuat keyboard segera muncul dengan sendirinya, tanpa animasi atau penundaan.

Membiarkan textFieldmenjadi variabel instance dari MyViewController(subclass dari UIViewController).

Hubungi [textField becomeFirstResponder]di initWithNibName:bundle:(untuk subclass dari UIViewController) atau initWithStyle:(untuk subclass dari UITableViewController), tidak dalam viewDidLoad. Misalnya:

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

Atau, panggil setelah menginisialisasi tetapi sebelum mendorong UIViewController. Misalnya:

MyViewController *viewController = [[MyViewController alloc] init];
[viewController.textField becomeFirstResponder];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];
ma11hew28
sumber
Menarik. Apakah Anda yakin ini berfungsi sepanjang waktu? Kekhawatiran saya adalah Anda tidak mereferensikan view, jadi tidak pasti apakah file nib telah dimuat. Jika textFieldadalah IBOutlet, maka saya pikir itu akan menjadi nol pada saat ini.
Rob Napier
5

Sudah selesai [textfield becomeFirstResponder];

Dan setelah Anda mendapatkan nilai dari textfield di kode Anda, lakukan [textfield resignFirstResponder];. Itu akan membantu Anda, saya pikir.

Gani
sumber
4

Jika Anda menjalankan Simulator iPhone 4.0 saat ini, pesan kesalahan ini sering muncul saat memutar layar (atau saat beranimasi setelah memutar layar) disertai dengan jeda 1-2 detik dalam animasi.

Ini adalah bug dalam versi Simulator ini dan akan segera diperbaiki.

Matt Gallagher
sumber
terima kasih atas info tentang bug simulator iOS4. untuk proyek yang sama, wait_fencespesan tidak muncul di simulator 3.1
ohho
3

Lihat di sini untuk info lebih lanjut: http://www.iphonedevsdk.com/forum/iphone-sdk-development-advanced-discussion/17373-wait_fences-failed-receive-reply-10004003-a.html

Masalah Anda terkait.

Andrew Johnson
sumber
Terima kasih atas bantuannya, tetapi sayangnya saya tidak dapat menemukan solusi untuk masalah saya di halaman itu. "Tampaknya terjadi saat subview (mis. UIAlertView) dibuat sebelum tampilan induk / supernya." Ini seharusnya tidak terjadi pada kode di atas, bukan?
Michael
3

timpa viewDidappear, bukan viewWillAppear:

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

Saya dapat mensimulasikan ini satu-satu melalui kode UIAlertView ini.

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

Ketika NSLocalizedString tidak didefinisikan dalam file Localizable.strings, akan memakan waktu lama untuk mencari teks, sehingga peringatan akan muncul dan "wait_fences: gagal menerima balasan: 10004003" akan ditampilkan.

Bagi saya, saya hanya perlu menambahkan teks ke file Localizable.strings dan masalah saya terpecahkan. Mungkinkah ini juga kasus kejadian lainnya?

Vincent
sumber
1

Juga dengan UIAlertView. Yang menyelesaikannya bagi saya adalah pengunduran diri seperti di bawah ini, seperti yang disebutkan lab pergudangan sebelumnya.

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

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

Delegasi UIAlertViewDelegate lainnya tidak memperbaiki masalah tersebut.

Marcus
sumber
1

Masalahnya adalah ada kondisi balapan di kode Apple. Biasanya, ini ada hubungannya dengan pembaruan UI yang salah.

Dalam pengalaman saya, Anda juga belum memanggil super di viewDidAppear, viewWillAppear, dll. Atau Anda mencoba menampilkan UIAlertView di viewDidLoad atau viewWillAppear.

Saat Anda menambahkan UIAlertView, kerangka kerja memerlukan referensi ke tampilan induk Anda. Tetapi jika Anda berada di viewWillAppear atau viewDidLoad, tampilan tidak benar-benar ditampilkan ... Anda harus mempertimbangkan untuk memindahkan kode ke viewDidAppear di mana tampilan siap digunakan oleh UIAlertView.

Halo Dunia
sumber
0

Apakah Bidang Teks terdapat dalam tampilan itu, atau di dalam sesuatu yang lain? Anda hanya dapat mengirim 'intoFirstRepsonder' ke sesuatu yang dimuat langsung dalam tampilan tersebut. Jika disimpan di beberapa komponen widget lainnya, Anda tidak boleh menyetel status responden pertama di widget ini, melainkan di widget yang sedang dibuat. Misalnya, jika Anda menambahkan bidang teks ke tampilan peringatan, karena pertunjukan terjadi secara tidak serempak, itu mungkin belum tersedia pada saat Anda memanggil beFirstResponder. (Idealnya, Anda akan memiliki sendiri pandangan peringatan kelas Anda dan menentukan bidang teks dalam itu, dan ketika bahwa pandangan menerima viewDidAppear, Anda akan mengatur textfield sebagai responden pertama pada saat itu.)

AlBlue
sumber
0

Saya juga mendapatkan pesan dan metode dan wait_fences: failed to receive reply: 10004003saya tidak melakukan apa pun selain mengirim pesan ke . Dalam kasus saya itu terjadi ketika saya memiliki pertunjukan di saya dan pengguna malah menekan tombol perangkat bulat iPhone dan kemudian kembali ke aplikasi. Ini terlihat dari tanganku.viewWill...viewDid...superUIAlertViewGameViewController

SK9
sumber
0

Alertview atau lembar tindakan harus ditampilkan di utas utama ... jadi jika Anda membuat koneksi sinkron dan melakukan operasi itu di utas lain dan menampilkan peringatan berdasarkan output yang Anda terima dari operasi itu, maka Anda akan mendapatkan pesan kesalahan ini wait_fences: gagal terima balasan: 10004003. Anda dapat melakukan sesuatu seperti ....

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

dan tampilkan peringatan dalam metode handleOutput yang meneruskan string respons keluaran sebagai parameter.

Vishal Singh
sumber
0

Solusi ada di sini!

Saya memiliki kesalahan yang sama, sekarang saya mendapatkan solusinya, ini dapat membantu Anda.

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