catatan:
Lihat jawaban yang diterima (bukan yang terpilih teratas) untuk solusi pada iOS 4.3.
Pertanyaan ini adalah tentang perilaku yang ditemukan di keyboard iPad, di mana ia menolak untuk diberhentikan jika ditampilkan dalam dialog modal dengan pengontrol navigasi.
Pada dasarnya, jika saya menghadirkan pengontrol navigasi dengan baris berikut seperti di bawah ini:
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
Keyboard menolak untuk diberhentikan. Jika saya mengomentari baris ini, keyboard akan hilang dengan baik.
...
Saya punya dua textFields, nama pengguna, dan kata sandi; nama pengguna memiliki tombol Berikutnya dan kata sandi memiliki tombol Selesai. Keyboard tidak akan hilang jika saya menyajikan ini di pengontrol navigasi modal.
BEKERJA
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
[self.view addSubview:b.view];
TIDAK BEKERJA
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController =
[[UINavigationController alloc]
initWithRootViewController:b];
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
navigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];
Jika saya menghapus bagian pengontrol navigasi dan menyajikan 'b' sebagai pengontrol tampilan modal dengan sendirinya, itu berfungsi. Apakah pengontrol navigasi masalahnya?
BEKERJA
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
b.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:b animated:YES];
[b release];
BEKERJA
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController =
[[UINavigationController alloc]
initWithRootViewController:b];
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];
UINavigationController
kelas. Bersulang.resignFirstResponder
mengeksekusi tetapi keyboard masih ditampilkan. Skenario saya (presentationFormSheet dengan navigasi contrllr) persis sama dengan milik Anda. Terima kasih banyak!!Jawaban:
Di pengontrol tampilan yang disajikan secara sederhana, cukup timpa
disablesAutomaticKeyboardDismissal
untuk kembaliNO
:sumber
Ini telah diklasifikasikan sebagai "karya sebagaimana dimaksud" oleh para insinyur Apple. Saya mengajukan bug untuk ini beberapa waktu lalu. Alasan mereka adalah bahwa pengguna sering memasukkan data dalam bentuk modal sehingga mereka berusaha untuk "membantu" dan menjaga keyboard tetap terlihat di mana biasanya berbagai transisi dalam tampilan modal dapat menyebabkan keyboard ditampilkan / disembunyikan berulang kali.
sunting: inilah tanggapan seorang insinyur Apple di forum pengembang:
Ini memberi banyak masalah pada orang (termasuk saya sendiri) tetapi saat ini sepertinya tidak ada cara untuk mengatasinya.
MEMPERBARUI:
Di iOS 4.3 dan yang lebih baru, Anda sekarang dapat menerapkan `-disableAutomaticKeyboardDismissal 'pada pengontrol tampilan Anda untuk mengembalikan TIDAK:
Ini memperbaiki masalah.
sumber
UINavigationController
subclass yang menimpadisablesAutomaticKeyboardDismissal
untuk kembaliNO
dan menggunakan ini sebagai pengontrol navigasi saat Anda menyajikan lembar formulir modal. Lihat jawaban dari @ miha-hribar di bawah ini.Hati-hati jika Anda menampilkan modal dengan a
UINavigationController
. Anda kemudian harus mengaturdisablesAutomaticKeyboardDismissal
pada pengontrol navigasi dan bukan pada pengontrol tampilan. Anda dapat dengan mudah melakukan ini dengan kategori.File: UINavigationController + KeyboardDismiss.h
File: UINavigationController + KeyboardDismiss.m
Jangan lupa untuk mengimpor kategori dalam file tempat Anda menggunakan UINavigationController.
sumber
disablesAutomaticKeyboardDismissal
dariUINavigationController
, bukan controller tampilan sendiri, untuk memperbaiki masalah ini.Saya memecahkan ini dengan menggunakan
UIModalPresentationPageSheet
gaya presentasi dan mengubah ukurannya segera setelah saya mempresentasikannya. Seperti itu:sumber
Jika Anda mengaktifkan tampilan modal yang berbeda, Anda bisa menghilangkan papan ketik. Itu tidak cantik dan tidak bernyawa turun, tetapi Anda bisa membuatnya pergi.
Akan lebih bagus jika ada perbaikan, tetapi untuk sekarang ini berfungsi. Anda dapat memasukkannya dalam kategori aktif
UIViewController
dan memanggilnya saat Anda ingin keyboard hilang:Hati-hati dengan ini meskipun Anda melihatDidAppear / viewDidDisappear dan semua metode dipanggil. Seperti yang saya katakan, itu tidak cantik, tetapi bekerja.
-Adam
sumber
Anda juga bisa menyiasatinya dalam aplikasi universal dengan hanya memeriksa idiom dan jika itu iPad, jangan muncul keyboard secara otomatis sama sekali dan biarkan pengguna mengetuk apa pun yang ingin mereka edit.
Mungkin bukan solusi terbaik tetapi sangat mudah dan tidak memerlukan hack mewah yang akan pecah dengan rilis iOS besar berikutnya :)
sumber
Masukkan kode ini di viewWillDisappear Anda: metode pengontrol saat ini adalah cara lain untuk memperbaikinya:
sumber
Saya menemukan itu
disablesAutomaticKeyboardDismissal
dan menambahkandisablesAutomaticKeyboardDismissal
fungsi tidak berfungsi untuk sayaUITextField
dalam dialog modal.Keyboard pada layar tidak akan hilang.
Solusi saya adalah untuk menonaktifkan semua kontrol input teks dalam dialog saya, kemudian mengaktifkan kembali yang relevan sepersekian detik kemudian.
Sepertinya saat iOS melihat bahwa tidak ada
UITextField
kontrol diaktifkan, maka tidak menyingkirkan keyboard.sumber
Saya yakin Anda telah melihat ini, tetapi Anda yakin bahwa kelas controller Anda terhubung dengan benar sebagai delegasi UITextField, kan?
sumber
mungkin jangan mengembalikan TIDAK, tapi YA. Jadi itu bisa hilang.
Dan Anda memiliki
textFieldShouldEndEditing
YA yang kembali juga?Dan mengapa kamu menembakmaaf saya mengerti sekarang[nextResponder becomeFirstResponder]
?!Bolehkah kita berasumsi bahwa tidak satu pun dari mereka yang memiliki
tag
nilaisecondField.tag+1
? Jika demikian, Anda memberi tahu mereka untuk menjadi responden pertama, alih-alih mengundurkan diri sebagai responden pertama. Mungkin menaruh beberapa NSLog () di struktur if.sumber
NSLog("tf %x / method ...",textField);
semua fungsi delegasi?Bagi mereka yang memiliki masalah dengan UINavigationController, lihat jawaban saya untuk pertanyaan serupa di sini: https://stackoverflow.com/a/10507689/321785
Sunting: Saya menganggap ini sebagai peningkatan pada solusi Miha Hribar (karena keputusan sedang diambil di mana seharusnya), dan berlawanan dengan komentar Pascal mengenai kategori pada UIViewController
sumber
mungkin bukan solusi yang sempurna, tetapi bekerja
[self.view endEditing: YES];
dari mana pun tombol atau gerakan Anda diterapkan untuk menyajikan modal
sumber
sumber