Saya membuat aplikasi yang menggunakan UITextView
. Sekarang saya ingin Tampilan Teks memiliki placeholder mirip dengan yang Anda bisa atur untuk Bidang Teks. Bagaimana Anda melakukannya dengan menggunakan Swift?
ios
swift
uitextview
placeholder
StevenR
sumber
sumber
Jawaban:
Diperbarui untuk Swift 4
UITextView
secara inheren tidak memiliki properti placeholder sehingga Anda harus membuat dan memanipulasi satu program menggunakanUITextViewDelegate
metode. Saya sarankan menggunakan salah satu solusi # 1 atau # 2 di bawah ini tergantung pada perilaku yang diinginkan.Catatan: Untuk solusi mana pun, tambahkan
UITextViewDelegate
ke kelas dan aturtextView.delegate = self
untuk menggunakan metode delegasi tampilan teks.Solusi # 1 - Jika Anda ingin placeholder menghilang segera setelah pengguna memilih tampilan teks:
Pertama, atur
UITextView
agar berisi teks placeholder dan setel ke warna abu-abu terang untuk meniru tampilanUITextField
teks placeholder. Entah melakukannya diviewDidLoad
atau setelah penciptaan tampilan teks.Kemudian ketika pengguna mulai mengedit tampilan teks, jika tampilan teks berisi placeholder (yaitu jika warna teksnya abu-abu terang) hapus teks placeholder dan atur warna teks menjadi hitam untuk mengakomodasi entri pengguna.
Kemudian ketika pengguna selesai mengedit tampilan teks dan mengundurkan diri sebagai responden pertama, jika tampilan teks kosong, reset placeholder-nya dengan menambahkan kembali teks placeholder dan mengatur warnanya ke abu-abu terang.
Solusi # 2 - Jika Anda ingin placeholder ditampilkan kapan pun tampilan teks kosong, meskipun tampilan teks dipilih:
Pertama-tama atur placeholder di
viewDidLoad
:(Catatan: Karena OP ingin agar tampilan teks dipilih segera setelah tampilan dimuat, saya memasukkan pemilihan tampilan teks ke dalam kode di atas. Jika ini bukan perilaku yang Anda inginkan dan Anda tidak ingin tampilan teks dipilih pada tampilan beban, hapus dua baris terakhir dari potongan kode di atas.)
Kemudian gunakan
shouldChangeTextInRange
UITextViewDelegate
metode ini, seperti:Dan juga implementasikan
textViewDidChangeSelection
untuk mencegah pengguna mengubah posisi kursor sementara placeholder terlihat. (Catatan:textViewDidChangeSelection
dipanggil sebelum tampilan dimuat sehingga hanya memeriksa warna tampilan teks jika jendela terlihat):sumber
yourTextField.delegate = self
. Jika Anda tidak melakukan ini,textViewDidBeginEditing
dantextViewDidEndEditing
fungsi tidak akan bekerja.Cannot convert value of type 'NSRange' (aka '_NSRange') to expected argument type 'Range<String.Index>' (aka 'Range<String.CharacterView.Index>')
.let currentText = textView.text as NSString?
. Ubahlet updatedText =
garis menjadilet updatedText = currentText?.replacingCharacters(in: range, with: text)
. Akhirnya, ubahif updatedText.isEmpty
garis menjadiif (updatedText?.isEmpty)! {
. Itu harus melakukan trik!textView.selectedTextRange
dari dalamfunc textViewDidChangeSelection(_ textView: UITextView)
menyebabkan loop tak terbatas ...Placeholder Terapung
Sederhana, aman, dan andal untuk menempatkan label placeholder di atas tampilan teks, mengatur font, warna, dan mengelola visibilitas placeholder dengan melacak perubahan pada jumlah karakter tampilan teks.
Swift 3:
Swift 2: Sama, kecuali:
italicSystemFontOfSize(textView.font.pointSize)
,UIColor.lightGrayColor
sumber
Sangat merekomendasikan untuk menggunakan pustaka KMPlaceholderTextView . Sangat mudah digunakan.
sumber
Cepat:
Tambahkan tampilan teks Anda secara terprogram atau melalui Interface Builder, jika yang terakhir, buat outlet:
Silakan tambahkan delegasi (UITextViewDelegate):
Dalam metode viewDidLoad, jangan tambahkan yang berikut ini:
Sekarang izinkan saya memperkenalkan bagian ajaib, tambahkan fungsi ini:
Perhatikan bahwa ini akan dijalankan setiap kali pengeditan dimulai, di sana kami akan memeriksa kondisi untuk memberi tahu negara bagian, menggunakan properti warna. Menyetel teks ke
nil
saya tidak merekomendasikan. Tepat setelah itu, kami mengatur warna teks yang diinginkan, dalam hal ini, hitam.Sekarang tambahkan fungsi ini juga:
Biarkan saya bersikeras, jangan dibandingkan dengan
nil
, saya sudah mencobanya dan itu tidak akan berhasil. Kami kemudian mengatur nilai kembali ke gaya placeholder, dan mengatur warna kembali ke warna placeholder karena itu adalah kondisi untuk check-intextViewDidBeginEditing
.sumber
Gunakan Ekstensi Ini ini adalah cara terbaik untuk mengatur placeholder di UITextView. Tetapi pastikan Anda telah melampirkan delegasi ke TextView. Anda dapat mengatur Place holder seperti ini: -
sumber
Saya terkejut tidak ada yang menyebutkan
NSTextStorageDelegate
.UITextViewDelegate
Metode hanya akan dipicu oleh interaksi pengguna, tetapi tidak secara terprogram. Misalnya ketika Anda menyeteltext
properti tampilan teks secara terprogram, Anda harus mengatur visibilitas placeholder sendiri, karena metode delegasi tidak akan dipanggil.Namun, dengan
NSTextStorageDelegate
'stextStorage(_:didProcessEditing:range:changeInLength:)
metode, Anda akan diberitahu setiap perubahan ke teks, bahkan jika itu dilakukan pemrograman. Tetapkan saja seperti ini:(Dalam
UITextView
, properti delegasi ininil
secara default, sehingga tidak akan memengaruhi perilaku default apa pun.)Menggabungkannya dengan
UILabel
teknik @clearlight menunjukkan, orang dapat dengan mudah membungkus seluruhUITextView
'splaceholder
pelaksanaan menjadi perpanjangan.Perhatikan bahwa penggunaan kelas privat (bersarang) disebut
PlaceholderLabel
. Ini tidak memiliki implementasi sama sekali, tetapi memberikan kami cara untuk mengidentifikasi label placeholder, yang jauh lebih 'cepat' daripada menggunakantag
properti.Dengan pendekatan ini, Anda masih dapat menetapkan delegasi
UITextView
untuk orang lain.Anda bahkan tidak perlu mengubah kelas tampilan teks Anda. Cukup tambahkan ekstensi dan Anda akan dapat menetapkan string placeholder ke setiap
UITextView
di proyek Anda, bahkan di Pembuat Antarmuka.Saya meninggalkan implementasi
placeholderColor
properti untuk alasan kejelasan, tetapi dapat diimplementasikan hanya untuk beberapa baris dengan variabel yang dikomputasi serupaplaceholder
.sumber
textView.textStorage.delegate = self
ini dalam view-controller akan mengharuskan kita untuk mengikat view-controller denganNSTextStorageDelegate
. Itu benar-benar membutuhkan?NSTextStorageDelegate
, bukan view controller.Saya melakukan ini dengan menggunakan dua tampilan teks yang berbeda:
Idenya adalah setelah pengguna mulai mengetikkan hal-hal di tampilan latar depan, placeholder di latar belakang menghilang (dan muncul kembali jika pengguna menghapus semuanya). Jadi berperilaku persis seperti placeholder untuk bidang teks baris tunggal.
Ini kode yang saya gunakan untuk itu. Perhatikan bahwa descriptionField adalah bidang yang diketik pengguna dan descriptionPlaceholder adalah yang ada di latar belakang.
sumber
Berdasarkan beberapa saran hebat di sini, saya dapat mengumpulkan subkelas ringan yang kompatibel dengan Interface-Builder
UITextView
, yang:UITextField
.text
properti bidang .Setiap saran perbaikan dipersilahkan, terutama jika ada cara untuk menarik warna placeholder iOS secara terprogram, daripada mengkodekannya.
Swift v5:
sumber
SET nilai dalam tampilan beban
sumber
Saya mencoba untuk membuat kode nyaman dari Clearlight 's jawaban .
pemakaian
sumber
Satu lagi solusi (Swift 3):
hasil
sumber
Solusi sederhana dan cepat yang berfungsi untuk saya adalah:
sumber
Inilah yang saya gunakan untuk pekerjaan ini dilakukan.
Saya tahu ada beberapa pendekatan yang mirip dengan ini tetapi manfaat dari yang satu ini adalah:
sumber
Cepat 3.2
Pertama ketika pengguna mulai mengedit panggilan textViewDidBeginEditing dan kemudian memeriksa apakah warna teks abu-abu berarti pengguna tidak menulis apa-apa kemudian ditetapkan sebagai textview nil dan ubah warna menjadi hitam untuk texting pengguna.
Ketika pengguna akhir mengedit textViewDidEndEditing adalah panggilan dan periksa apakah pengguna tidak menulis apa pun di tampilan teks maka teks ditetapkan sebagai warna abu-abu dengan teks "PlaceHolder"
sumber
Inilah cara saya memecahkan masalah ini ( Swift 4 ):
Idenya adalah untuk membuat solusi sesederhana mungkin yang memungkinkan untuk menggunakan placeholder dengan warna berbeda, mengubah ukuran menjadi placeholder, tidak akan menimpa
delegate
sementara itu menjaga semuaUITextView
fungsi berfungsi seperti yang diharapkan.sumber
Saya tidak tahu mengapa orang terlalu memperumit masalah ini .... Ini cukup mudah dan sederhana. Berikut adalah subkelas dari UITextView yang menyediakan fungsionalitas yang diminta.
sumber
Ini adalah solusi saya siap pakai jika Anda bekerja dengan beberapa tampilan teks
sumber
Cepat 3.1
Ekstensi ini bekerja dengan baik untuk saya: https://github.com/devxoul/UITextView-Placeholder
Berikut ini cuplikan kode:
Instal melalui pod:
Impor ke kelas Anda
Dan tambahkan
placeholder
properti ke yang sudah Anda buatUITextView
Itu ... Begini tampilannya (Kotak ketiga adalah a
UITextView
)sumber
Bertentangan dengan hampir setiap jawaban pada posting ini,
UITextView
memang memiliki properti placeholder. Untuk alasan di luar pemahaman saya, itu hanya terekspos di IB, seperti:Jadi jika Anda menggunakan storyboard dan placeholder statis sudah cukup, cukup atur properti pada inspektur.
Anda juga dapat mengatur properti ini dalam kode seperti ini:
Its berawan untuk cuaca ini diakses melalui API pribadi, seperti properti yang terkena.
Saya belum mencoba mengirim dengan metode ini. Tetapi saya akan mengirimkan cara ini segera dan akan memperbarui jawaban ini sesuai.
MEMPERBARUI:
Saya telah mengirimkan kode ini dalam beberapa rilis tanpa masalah dari Apple.
PEMBARUAN: Ini hanya akan berfungsi di Xcode pra 11.2
sumber
UITextField
TIDAK,UITextView
harap baca pertanyaan / tanggapan lebih hati-hati.Tidak ada properti seperti itu di ios untuk menambahkan placeholder langsung di TextView melainkan Anda dapat menambahkan label dan menampilkan / menyembunyikan perubahan di textView. SWIFT 2.0 dan pastikan untuk mengimplementasikan delegasi textview
sumber
Swift - Saya menulis kelas yang mewarisi UITextView dan saya menambahkan UILabel sebagai subview untuk bertindak sebagai pengganti.
sumber
Saya suka solusi @ nerdist. Berdasarkan itu, saya membuat ekstensi ke
UITextView
:Di kelas ViewController, misalnya, ini adalah bagaimana saya menggunakannya:
Placeholder di UITextview!
PEMBARUAN :
Jika Anda mengubah teks textview dalam kode, ingatlah untuk memanggil metode updateVisibitly untuk menyembunyikan placeholder:
Untuk mencegah placeholder ditambahkan lebih dari sekali,
add()
fungsi pribadi ditambahkanextension
.sumber
Di swift2.2:
}
Dalam swift3:
kelas CustomTextView: UITextView {
}
Saya menulis kelas dengan cepat. Anda perlu mengimpor kelas ini kapan pun diperlukan.
sumber
Saya tidak dapat menambahkan komentar karena reputasi. tambahkan satu lagi kebutuhan delegasi dalam jawaban @clearlight.
adalah kebutuhan
karena
textViewDidChange
tidak disebut pertama kalisumber
tidak ada placeholder yang tersedia untuk tampilan teks. Anda harus meletakkan label di atasnya ketika pengguna masuk ke tampilan teks lalu menyembunyikannya atau mengaturnya dengan nilai default saat pengguna memasukkan menghapus semua nilai.
sumber
sumber
Saya harus mengirim antrean agar teks placeholder saya muncul kembali setelah pengeditan selesai.
sumber
Cepat:
Tambahkan Anda
TextView
@IBOutlet
:Dalam
viewWillAppear
metode ini, tambahkan yang berikut ini:Silakan tambahkan
Delegate
ekstensi Menggunakan (UITextViewDelegate):sumber
Solusi kami menghindari penghancuran dengan
UITextView
text
dantextColor
properti, yang berguna jika Anda mempertahankan penghitung karakter.Itu mudah:
1) Buat boneka
UITextView
di Storyboard dengan properti yang sama dengan masternyaUITextView
. Tetapkan teks placeholder ke teks dummy.2) Sejajarkan tepi atas, kiri, dan kanan keduanya
UITextViews.
3) Tempatkan boneka di belakang master.
4) Mengesampingkan
textViewDidChange(textView:)
fungsi delegasi master, dan menunjukkan dummy jika master memiliki 0 karakter. Jika tidak, tunjukkan master.Ini mengasumsikan keduanya
UITextViews
memiliki latar belakang transparan. Jika tidak, letakkan boneka di atas ketika ada 0 karakter, dan dorong di bawahnya ketika ada> 0 karakter. Anda juga harus menukar responden untuk memastikan kursor mengikuti yang benarUITextView
.sumber
Swift 4, 4.2 dan 5
sumber