Bagaimana saya bisa menavigasi semua bidang teks saya dengan Tombol "Next" pada Keyboard iPhone?
Bidang teks terakhir harus menutup Keyboard.
Saya sudah menyiapkan IB the Buttons (Next / Done) tapi sekarang saya macet.
Saya menerapkan tindakan textFieldShouldReturn tapi sekarang Tombol Berikutnya dan Selesai menutup Keyboard.
ios
objective-c
iphone
phx
sumber
sumber
Jawaban:
Di Cocoa untuk Mac OS X, Anda memiliki rantai responden berikutnya, di mana Anda dapat menanyakan bidang teks kontrol apa yang harus difokuskan selanjutnya. Inilah yang membuat tabing antar bidang teks berfungsi. Tetapi karena perangkat iOS tidak memiliki keyboard, hanya sentuhan, konsep ini tidak selamat dari transisi ke Cocoa Touch.
Ini dapat dengan mudah dilakukan, dengan dua asumsi:
UITextField
s berada pada tampilan induk yang sama.Dengan asumsi ini Anda dapat mengganti textFieldShouldReturn: karena ini:
Tambahkan beberapa kode lagi, dan asumsi tersebut dapat diabaikan juga.
Cepat 4.0
Jika superview dari bidang teks akan menjadi UITableViewCell maka responden selanjutnya adalah
sumber
UITableViewCell
. Anda perlu mengaksesUITableView
sel terkait dan mendapatkan sel yang berisi bidang teks yang Anda cari.UITextFieldDelegate
dan mengatur delegasi bidang teks.Ada solusi yang jauh lebih elegan yang mengejutkan saya saat pertama kali saya melihatnya. Manfaat:
UITextField
danUITextView
kontrol - atau kontrol UI entri keyboardBuat subclass UITextField yang memiliki
IBOutlet
properti yang disebut nextField. Inilah tajuknya:Dan inilah implementasinya:
Di pengontrol tampilan Anda, Anda akan membuat
-textFieldShouldReturn:
metode delegasi:Di IB, ubah UITextFields Anda untuk menggunakan
SOTextField
kelas. Selanjutnya, juga di IB, atur delegasi untuk masing-masing 'SOTextFields'to' Pemilik File '(yang tepat di mana Anda meletakkan kode untuk metode delegasi - textFieldShouldReturn). Keindahan desain ini adalah bahwa sekarang Anda cukup mengklik kanan pada TextField apa pun dan menetapkan outlet nextField keSOTextField
objek berikutnya yang Anda inginkan untuk menjadi responden berikutnya.Selain itu, Anda dapat melakukan hal-hal keren seperti loop the textFields sehingga setelah yang terakhir kehilangan fokus, yang pertama akan menerima fokus lagi.
Ini dengan mudah dapat diperpanjang secara otomatis menetapkan
returnKeyType
satuSOTextField
untukUIReturnKeyNext
jika ada nextField ditugaskan - satu hal yang kurang secara manual configure.sumber
UITableView
. Meskipun saya memilikiIBOutlet
properti pada pengontrol tampilan untuk setiap bidang teks, itu tidak membiarkan saya menautkannextField
properti ke properti pada Pemilik File. Adakah saran bagaimana saya bisa membuatnya bekerja dalam skenario ini?textField1.nextField = textField2; textField2.nextField = textField3;
, dll.Inilah satu tanpa delegasi:
ObjC:
Bekerja menggunakan tindakan (kebanyakan tidak diketahui)
UIControlEventEditingDidEndOnExit
UITextField
.Anda juga dapat dengan mudah menghubungkan ini di storyboard, sehingga tidak ada delegasi atau kode yang diperlukan.
Sunting: sebenarnya saya tidak tahu bagaimana cara menghubungkan ini di storyboard.
becomeFirstResponder
tampaknya tidak menjadi tindakan yang ditawarkan untuk acara kontrol ini, yang sangat disayangkan. Namun, Anda dapat mengaitkan semua bidang teks Anda ke satu tindakan di ViewController Anda yang kemudian menentukan textField mana yang akanbecomeFirstResponder
didasarkan pada pengirim (meskipun kemudian itu tidak seanggun solusi program di atas sehingga IMO melakukannya dengan kode di atasviewDidLoad
).sumber
[tfN addTarget:self action:@selector(loginButtonTapped:) forControlEvents:UIControlEventEditingDidEndOnExit];
. Terima kasih @mxcl.Ini solusi saya untuk masalah ini.
Untuk mengatasi ini (dan karena saya benci mengandalkan tag untuk melakukan hal-hal), saya memutuskan untuk menambahkan properti kustom ke objek UITextField. Dengan kata lain saya membuat kategori di UITextField seperti ini:
UITextField + Extended.h
UITextField + Extended.m
Sekarang, inilah cara saya menggunakannya:
Dan mengimplementasikan metode textFieldShouldReturn:
Saya sekarang memiliki semacam daftar UITextField yang ditautkan, masing-masing mengetahui siapa yang berada di baris selanjutnya.
Semoga ini bisa membantu.
sumber
Ekstensi cepat yang menerapkan jawaban mxcl untuk menjadikannya sangat mudah (disesuaikan dengan swift 2.3 oleh Traveler):
Mudah digunakan:
Ekstensi akan mengatur tombol kembali ke "Berikutnya" untuk semua kecuali bidang terakhir dan ke "Selesai" untuk bidang terakhir, dan alihkan fokus / abaikan keyboard saat ini diketuk.
Cepat <2.3
SWIFT 3: gunakan seperti ini -
sumber
UITextFieldDelegate
, dan mengimplementasikanfunc textFieldDidEndEditing(textField: UITextField)
. Kembalilah lebih awal jikatextField != field3
.Cara yang lebih konsisten dan kuat adalah dengan menggunakan NextResponderTextField Anda dapat mengkonfigurasinya secara total dari pembuat antarmuka tanpa perlu mengatur delegasi atau menggunakan
view.tag
.Yang perlu Anda lakukan adalah
UITextField
menjadiNextResponderTextField
nextResponderField
to point ke responder berikutnya itu bisa berupa apa sajaUITextField
atauUIResponder
subclass apa pun . Ini juga bisa menjadi UIButton dan pustaka cukup pintar untuk memicuTouchUpInside
acara tombol hanya jika diaktifkan.Berikut adalah perpustakaan yang sedang beraksi:
sumber
Saya suka solusi OO yang telah disarankan oleh Anth0 dan Answerserbot. Namun, saya sedang mengerjakan POC cepat dan kecil, jadi saya tidak ingin mengacaukan hal-hal dengan subclass dan kategori.
Solusi sederhana lainnya adalah membuat NSArray bidang dan mencari bidang berikutnya saat Anda menekan berikutnya. Bukan solusi OO, tetapi cepat, sederhana, dan mudah diimplementasikan. Anda juga dapat melihat dan memodifikasi pemesanan secara sekilas.
Inilah kode saya (dibangun di atas jawaban lain di utas ini):
sumber
Berikut ini adalah implementasi tabbing menggunakan kategori di UIControl. Solusi ini memiliki semua kelebihan metode dari Michael dan Anth0, tetapi berfungsi untuk semua kontrol UIC, bukan hanya
UITextField
s. Ini juga berfungsi mulus dengan Interface Builder dan storyboard.Sumber dan aplikasi sampel: repositori GitHub untuk UIControlsWithTabbing
Pemakaian:
Tajuk:
Penerapan:
sumber
Saya telah mencoba banyak kode dan akhirnya, ini berhasil untuk saya di Swift 3.0 Latest [Maret 2017]
The
ViewController
kelas harus mewarisiUITextFieldDelegate
untuk membuat kode kerja ini.Tambahkan bidang Teks dengan nomor Tag yang Tepat dan nomor tag ini digunakan untuk mengambil kendali ke bidang teks yang sesuai berdasarkan nomor tag tambahan yang ditetapkan untuknya.
Dalam kode di atas, di
returnKeyType = UIReturnKeyType.next
mana akan membuat Key pad kembali kunci untuk ditampilkan karenaNext
Anda juga memiliki opsi lainJoin/Go
lain, dll, berdasarkan aplikasi Anda mengubah nilai-nilai.Ini
textFieldShouldReturn
adalah metode yang dikontrol oleh UITextFieldDelegate dan di sini kami memiliki pemilihan bidang berikutnya berdasarkan peningkatan nilai Tagsumber
UITextView
. Adakah yang tahu bagaimana melakukan ini dalam kombinasi?UITextField
(masukkan satu baris teks), yang lain adalahUITextView
(masukkan beberapa baris teks).UITextView
jelas tidak merespons kode ini tetapi dapat digunakan dalam bentuk.Setelah Anda keluar dari satu bidang teks, Anda memanggil [otherTextField menjadiFirstResponder] dan bidang berikutnya mendapat fokus.
Ini sebenarnya bisa menjadi masalah yang sulit untuk dihadapi karena sering kali Anda juga ingin menggulir layar atau menyesuaikan posisi bidang teks sehingga mudah dilihat saat mengedit. Pastikan untuk melakukan banyak pengujian dengan masuk dan keluar dari bidang teks dengan cara yang berbeda dan juga pergi lebih awal (selalu memberi pengguna pilihan untuk mengabaikan keyboard daripada pergi ke bidang berikutnya, biasanya dengan "Selesai" di bilah nav)
sumber
sumber
Metode yang sangat mudah untuk mengabaikan keyboard ketika tombol 'Selesai' ditekan adalah:
Buat IBAction baru di header
Dalam file implementasi (file .m) tambahkan metode berikut:
Kemudian, ketika Anda datang untuk menautkan IBAction ke bidang teks - tautan ke acara 'Did End On Exit'.
sumber
Setel tombol kembali keyboard pertama kali di xib, jika tidak, Anda dapat menulis kode di
viewdidload
:sumber
Saya terkejut dengan banyaknya jawaban di sini yang gagal memahami satu konsep sederhana: menavigasi melalui kontrol di aplikasi Anda bukanlah sesuatu yang seharusnya dilakukan oleh pandangan itu sendiri. Adalah tugas pengontrol untuk memutuskan kontrol mana yang membuat responden pertama berikutnya.
Sebagian besar jawaban hanya berlaku untuk navigasi maju, tetapi pengguna juga mungkin ingin mundur.
Jadi inilah yang saya pikirkan. Formulir Anda harus dikelola oleh pengontrol tampilan, dan pengontrol tampilan adalah bagian dari rantai responden. Jadi, Anda bebas menerapkan metode berikut:
Logika tambahan untuk menggulir responden dari layar yang terlihat sebelumnya mungkin berlaku.
Keuntungan lain dari pendekatan ini adalah bahwa Anda tidak perlu mensubklasifikasikan semua jenis kontrol yang mungkin ingin Anda tampilkan (seperti
UITextField
s) tetapi sebaliknya dapat mengelola logika pada tingkat pengontrol, di mana, jujur saja, adalah tempat yang tepat untuk melakukannya .sumber
Saya telah menambahkan ke jawaban PeyloW jika Anda ingin menerapkan fungsi tombol sebelumnya / berikutnya:
Di mana Anda mensubklasifikasikan UIView seperti ini:
sumber
Halo semua, tolong lihat yang ini
sumber
Saya mencoba memecahkan masalah ini menggunakan pendekatan yang lebih canggih berdasarkan pada penugasan setiap sel (atau
UITextField
) dalamUITableView
nilai tag unik yang dapat diambil kembali: aktifkan-next-uitextfield-di-uitableview-iosSaya harap ini membantu!
sumber
Saya baru saja membuat Pod baru ketika menangani hal-hal ini GNTextFieldsCollectionManager . Secara otomatis menangani masalah textField berikutnya / terakhir dan sangat mudah digunakan:
Raih semua bidang teks yang diurutkan dengan muncul dalam hierarki tampilan (atau dengan tag), atau Anda dapat menentukan larik textFields Anda sendiri.
sumber
Solusi di Swift 3.1, Setelah menghubungkan bidang teks Anda, IBOutlets mengatur delegasi bidang teks Anda di viewDidLoad, Dan kemudian menavigasi tindakan Anda di textFieldShouldReturn
sumber
Jika seseorang ingin seperti ini. Saya pikir ini adalah yang paling dekat dengan persyaratan yang diminta
Inilah cara saya menerapkan yang satu ini
Tambahkan tampilan aksesori untuk setiap bidang teks yang Anda inginkan pengaturannya, gunakan
Gunakan fungsi berikut untuk menangani keran
Anda perlu memberikan tag textFields secara berurutan di mana Anda ingin tombol next / prev untuk merespons.
sumber
Saya lebih suka:
Dalam file NIB saya menghubungkan textFields dalam urutan yang diinginkan ke dalam array inputFields ini. Setelah itu saya melakukan tes sederhana untuk indeks UITextField yang melaporkan bahwa pengguna mengetuk kembali:
sumber
sumber
Saya memiliki sekitar 10+ UITextField di papan cerita saya dan cara saya mengaktifkan fungsionalitas berikutnya adalah dengan membuat array UITextField dan membuat UITextField berikutnya sebagai responden pertama. Inilah file implementasi:
sumber
Ini bekerja untuk saya di Xamarin.iOS / Monotouch. Ubah tombol keyboard ke Berikutnya, berikan kontrol ke UITextField berikutnya dan sembunyikan keyboard setelah UITextField terakhir.
Di dalam ViewDidLoad Anda akan memiliki:
Jika TextFields Anda belum memiliki Tag, atur sekarang:
dan hanya panggilan
sumber
Ini adalah solusi sederhana dengan cepat, tanpa menggunakan tag, tanpa trik papan cerita ...
Cukup gunakan ekstensi ini:
Dan menyebutnya seperti ini (misalnya) dengan delegasi bidang teks Anda:
sumber
Cara yang lebih aman dan lebih langsung, dengan asumsi:
Swift 4.1:
sumber
di textFieldShouldReturn Anda harus memeriksa bahwa bidang teks Anda saat ini bukan yang terakhir ketika mereka mengklik berikutnya dan jika itu tidak mengabaikan keyboard ..
sumber
Ini adalah posting lama, tetapi memiliki peringkat halaman yang tinggi jadi saya akan berpadu dengan solusi saya.
Saya memiliki masalah serupa dan akhirnya membuat subclass
UIToolbar
untuk mengelola fungsionalitas berikutnya / sebelumnya / selesai dalam tableView dinamis dengan bagian: https://github.com/jday001/DataEntryToolbarAnda mengatur bilah alat sebagai inputAccessoryView dari bidang teks Anda dan menambahkannya ke kamus. Ini memungkinkan Anda untuk menggilir maju dan mundur, bahkan dengan konten dinamis. Ada metode pendelegasian jika Anda ingin memicu fungsionalitas Anda sendiri ketika navigasi TextField terjadi, tetapi Anda tidak harus berurusan dengan mengelola tag apa pun atau status responden pertama.
Ada cuplikan kode & contoh aplikasi di tautan GitHub untuk membantu dengan detail implementasi. Anda akan membutuhkan model data Anda sendiri untuk melacak nilai-nilai di dalam bidang.
sumber
Tanpa tag penggunaan dan tanpa menambahkan properti untuk nextField / nextTextField, Anda dapat mencoba ini untuk meniru TAB, di mana "testInput" adalah bidang aktif Anda saat ini:
sumber
Saya telah menggunakan jawaban Michael G. Emmons selama sekitar satu tahun sekarang, bekerja dengan baik. Baru-baru ini saya memperhatikan bahwa memanggil resignFirstResponder dan kemudian menjadiFirstResponder segera dapat menyebabkan keyboard "glitch", menghilang dan kemudian segera muncul. Saya mengubah versinya sedikit untuk melewati resignFirstResponder jika nextField tersedia.
sumber