Di perpustakaan IB, pengantar memberitahu kita bahwa ketika returntombol ditekan, keyboard untuk UITextView
akan hilang. Tetapi sebenarnya returnkuncinya hanya dapat bertindak sebagai '\ n'.
Saya dapat menambahkan tombol dan gunakan [txtView resignFirstResponder]
untuk menyembunyikan keyboard.
Tetapi apakah ada cara untuk menambahkan aksi untuk returntombol di keyboard sehingga saya tidak perlu menambahkan UIButton
?
iphone
objective-c
keyboard
uitextview
iphone-softkeyboard
Zhong Dingin
sumber
sumber
Jawaban:
UITextView
tidak memiliki metode apa pun yang akan dipanggil ketika pengguna menekan tombol kembali. Jika Anda ingin pengguna hanya dapat menambahkan satu baris teks, gunakan aUITextField
. Menekan tombol kembali dan menyembunyikan keyboard untukUITextView
tidak mengikuti panduan antarmuka.Bahkan jika Anda ingin melakukan ini, terapkan
textView:shouldChangeTextInRange:replacementText:
metodeUITextViewDelegate
dan di periksa apakah teks pengganti\n
, sembunyikan keyboard.Mungkin ada cara lain tapi saya tidak tahu.
sumber
[textField setReturnKeyType: UIReturnKeyDone];
atau menggunakan pembangun antarmukaKupikir aku akan memposting snippet di sini:
Pastikan Anda menyatakan dukungan untuk
UITextViewDelegate
protokol.Pembaruan Swift 4.0:
sumber
Saya tahu ini sudah dijawab tetapi saya tidak begitu suka menggunakan string literal untuk baris baru jadi inilah yang saya lakukan.
Pembaruan Swift 4.0:
sumber
NSString *replacedText = [textView.text stringByReplacingCharactersInRange:range withString:text]
.Saya tahu ini telah dijawab berkali-kali, tetapi inilah dua sen saya untuk masalah ini.
Saya menemukan jawaban oleh samvermette dan ribeto sangat berguna, dan juga komentar oleh maxpower dalam jawaban ribeto . Tetapi ada masalah dengan pendekatan itu. Masalah yang matt sebutkan dalam jawaban samvermette dan jika pengguna ingin menempelkan sesuatu dengan garis putus di dalamnya, keyboard akan bersembunyi tanpa menempelkan apa pun.
Jadi pendekatan saya adalah campuran dari tiga solusi yang disebutkan di atas dan hanya memeriksa apakah string yang dimasukkan adalah baris baru ketika panjang string adalah 1 sehingga kami memastikan pengguna mengetik bukannya menempel.
Inilah yang telah saya lakukan:
sumber
Cara yang lebih elegan adalah dengan mengabaikan keyboard saat pengguna mengetuk suatu tempat di luar bingkai keyboard.
Pertama, atur tampilan ViewController Anda ke kelas "UIControl" di inspektur identitas di UIBuilder. Kontrol-seret tampilan ke dalam file header ViewController dan tautkan sebagai tindakan dengan acara tersebut sebagai Touch Up Inside, seperti:
ViewController.h
Dalam file ViewController utama, ViewController.m:
Anda dapat meminta ketuk dua kali atau sentuhan panjang menggunakan teknik serupa. Anda mungkin perlu mengatur ViewController Anda menjadi UITextViewDelegate dan menghubungkan TextView ke ViewController. Metode ini berfungsi untuk UITextView dan UITextField.
Sumber: Peternakan Nerd Besar
EDIT: Saya juga ingin menambahkan bahwa jika Anda menggunakan UIScrollView, teknik di atas mungkin tidak bekerja dengan mudah melalui Interface Builder. Dalam hal itu, Anda bisa menggunakan UIGestureRecognizer dan memanggil metode [[tampilan sendiri] endEditing: YES] sebagai gantinya. Contohnya adalah:
Ketika pengguna mengetuk di luar keyboard dan tidak mengetuk ruang entri, keyboard akan diberhentikan.
sumber
GestureRecognizer
tetapi masalah besar adalah bahwa semua tombol atau kontrol pada tampilan tidak lagi dapat diklik.Tambahkan metode ini di pengontrol tampilan Anda.
Cepat :
Metode ini juga dapat membantu Anda:
sumber
super.touchesBegan(touches:withEvent:)
.else { return true }
.Juga tambahkan
UITextViewDelegate
Jangan lupa untuk mengkonfirmasi protokol
JIKA Anda tidak menambahkan
if([text isEqualToString:@"\n"])
Anda tidak dapat mengeditsumber
NO
jika teks sama dengan@"\n"
.Ada solusi lain saat menggunakan dengan uitextview, Anda dapat menambahkan toolbar sebagai InputAccessoryView di "textViewShouldBeginEditing", dan dari tombol selesai toolbar ini Anda dapat mengabaikan keyboard, kode untuk ini adalah sebagai berikut:
sumber
Saya menemukan jawaban oleh josebama sebagai jawaban paling lengkap dan bersih yang tersedia di utas ini.
Di bawah ini adalah sintaks Swift 4 untuknya:
sumber
resultRange
bertujuan untuk menguji apakah teks hanya berisi baris yang menghindari hard-code "\ n".cepat
sumber
Menggunakan pengontrol navigasi untuk meng-host bar untuk mengabaikan keyboard:
dalam file .h:
dalam file .m:
sumber
Sama seperti komentar matt untuk samvermette, saya juga tidak menyukai gagasan mendeteksi "\ n". Kunci "kembali" ada karena suatu alasan di UITextView, yaitu untuk pergi ke baris berikutnya tentu saja.
Solusi terbaik menurut saya adalah meniru aplikasi pesan iPhone - yaitu menambahkan bilah alat (dan tombol) pada keyboard.
Saya mendapat kode dari posting blog berikut:
http://www.iosdevnotes.com/2011/02/iphone-keyboard-toolbar/
Langkah:
-Tambahkan bilah alat ke file XIB Anda - atur tingginya menjadi 460
-Tambahkan item tombol bilah alat (jika belum ditambahkan). Jika Anda perlu meluruskannya, tambahkan item tombol bilah fleksibel ke XIB, dan pindahkan item tombol bilah alat
Tindakan -Buat yang menautkan item tombol Anda untuk mengundurkan diriFirstResponder sebagai berikut:
-Kemudian:
sumber
Baru saja menyelesaikan masalah ini dengan cara yang berbeda.
Kontrol seret tombol ke
viewController.h
file dan buat tindakan (Acara Terkirim: Sentuh Di Dalam) seperti:Dalam
ViewController.m
akan terlihat seperti:sumber
Tambahkan pengamat di viewDidLoad
dan kemudian gunakan pemilih untuk memeriksa "\ n"
Itu menggunakan "\ n" dan tidak secara khusus memeriksa kunci kembali, tapi saya pikir ini OK.
MEMPERBARUI
Lihat jawaban ribto di bawah ini yang digunakan
[NSCharacterSet newlineCharacterSet]
sebagai pengganti\n
sumber
\n
dan kembali kunci dideteksi berdasarkan\n
jadi itu memeriksa kunci kembali. Satu-satunya perbedaan adalah bahwa Anda menggunakan notifikasi daripada menggunakan textViewDelegates.[NSCharacterSet newlineCharacterSet]
daripada mungkin cara yang lebih baik untuk pergi.Tukar Kode
Terapkan UITextViewDelegate di kelas Anda / Lihat seperti ini:
atur delegasi textView ke diri sendiri
Dan kemudian implementasikan hal berikut:
EDIT Saya memperbarui kode karena tidak pernah merupakan ide yang baik untuk mengubah input pengguna di bidang teks menjadi untuk workarround dan tidak mengatur ulang negara setelah kode hack selesai.
sumber
Coba ini :
sumber
// Kamu bisa menggunakan ini ...
Langkah 1. Langkah pertama adalah memastikan bahwa Anda menyatakan dukungan untuk
UITextViewDelegate
protokol. Ini dilakukan di file header Anda, seperti contoh di sini adalah header yang disebutEditorController.h:
Langkah 2. Selanjutnya Anda harus mendaftarkan controller sebagai delegasi UITextView. Melanjutkan dari contoh di atas, berikut adalah bagaimana saya menginisialisasi
UITextView
denganEditorController
sebagai delegasi ...Langkah 3. Dan sekarang bagian terakhir dari teka-teki adalah untuk mengambil tindakan sebagai respons terhadap
shouldCahngeTextInRange
pesan sebagai berikut:sumber
Anda juga dapat menyembunyikan keyboard saat menyentuh di layar tampilan:
sumber
Jawaban cepat:
sumber
Saya menggunakan kode ini untuk mengubah responden.
sumber
Pertanyaannya menanyakan bagaimana cara melakukannya dengan tombol kembali tetapi saya pikir ini bisa membantu seseorang dengan maksud untuk menghilangkan keyboard saat menggunakan UITextView:
Panggil addToolBarForTextView () di viewDidLoad atau metode siklus hidup lainnya.
Sepertinya itu adalah solusi sempurna bagi saya.
Bersulang,
Murat
sumber
Baik. Semua orang telah memberikan jawaban dengan trik tetapi saya pikir cara yang tepat untuk mencapainya adalah dengan
Menghubungkan tindakan berikut ke acara " Did End On Exit " di
Interface Builder
. (klik kananTextField
dan cntrl-drag dari ' Did end on exit ' ke metode berikut.sumber
Serupa dengan jawaban lain menggunakan
UITextViewDelegate
tetapi antarmuka swift yang lebih baruisNewline
adalah:sumber
sumber
sumber
Saya tahu itu bukan jawaban yang tepat untuk pertanyaan ini, tetapi saya menemukan utas ini setelah mencari jawabannya di internet. Saya berasumsi orang lain berbagi perasaan itu.
Ini adalah varian saya dari UITapGestureRecognizer yang saya temukan andal dan mudah digunakan - cukup atur delegasi dari TextView ke ViewController.
Alih-alih ViewDidLoad saya menambahkan UITapGestureRecognizer ketika TextView menjadi aktif untuk mengedit:
Ketika saya mengetuk di luar TextView, tampilan mengakhiri mode pengeditan dan UITapGestureRecognizer menghapus sendiri sehingga saya dapat terus berinteraksi dengan kontrol lain dalam tampilan.
Saya harap ini membantu. Tampaknya begitu jelas tetapi saya belum pernah melihat solusi ini di mana pun di web - apakah saya melakukan sesuatu yang salah?
sumber
Jangan lupa untuk mengatur delegasi untuk textView - jika tidak, resignfirstresponder tidak akan berfungsi.
sumber
Coba ini .
sumber
Untuk Xcode 6.4., Swift 1.2. :
sumber
Anda harus menambahkan
UIToolbar
ke atas UITextView agar lebih mudah daripada menggunakanshouldChangeTextIn
Dalam Swift 4
sumber
toolbar.sizeToFit()