Saya memiliki UITextView
yang menampilkan NSAttributedString
. String ini berisi kata-kata yang ingin saya buat dapat disadap, sehingga ketika diketuk, saya dipanggil kembali sehingga saya dapat melakukan tindakan. Saya menyadari bahwa UITextView
dapat mendeteksi ketukan pada URL dan memanggil kembali delegasi saya, tetapi ini bukan URL.
Menurut saya, dengan iOS 7 dan kekuatan TextKit sekarang ini seharusnya dapat dilakukan, namun saya tidak dapat menemukan contoh apa pun dan saya tidak yakin harus mulai dari mana.
Saya mengerti bahwa sekarang mungkin untuk membuat atribut khusus dalam string (meskipun saya belum melakukannya), dan mungkin ini akan berguna untuk mendeteksi jika salah satu kata ajaib telah diketuk? Bagaimanapun, saya masih tidak tahu cara mencegat ketukan itu dan mendeteksi kata mana ketukan itu terjadi.
Perhatikan bahwa kompatibilitas iOS 6 tidak diperlukan.
sumber
Mendeteksi ketukan pada teks yang diatribusikan dengan Swift
Kadang-kadang untuk pemula agak sulit untuk mengetahui bagaimana mengatur sesuatu (itu untuk saya sih), jadi contoh ini sedikit lebih lengkap.
Tambahkan
UITextView
ke proyek Anda.Toko
Hubungkan
UITextView
keViewController
dengan outlet bernamatextView
.Atribut khusus
Kami akan membuat atribut khusus dengan membuat Ekstensi .
Tambahkan file swift baru dengan File> New> File ...> iOS> Source> Swift File . Anda bisa menyebutnya apa yang Anda inginkan. Saya memanggil milik saya NSAttributedStringKey + CustomAttribute.swift .
Tempel kode berikut:
Kode
Ganti kode di ViewController.swift dengan yang berikut ini. Perhatikan
UIGestureRecognizerDelegate
.Sekarang jika Anda mengetuk "w" dari "Swift", Anda akan mendapatkan hasil sebagai berikut:
Catatan
NSAttributedString.Key.foregroundColor
(warna teks) yang memiliki nilaiUIColor.green
.Pelajaran lanjutan
Jawaban ini didasarkan pada beberapa jawaban lain atas pertanyaan ini. Selain ini, lihat juga
sumber
myTextView.textStorage
sebagai penggantimyTextView.attributedText.string
Ini adalah versi yang sedikit dimodifikasi, dibangun dari jawaban @tarmes. Saya tidak bisa mendapatkan
value
variabel untuk mengembalikan apa pun kecualinull
tanpa perubahan di bawah ini. Juga, saya membutuhkan kamus atribut lengkap dikembalikan untuk menentukan tindakan yang dihasilkan. Saya akan meletakkan ini di komentar tetapi tampaknya tidak memiliki perwakilan untuk melakukannya. Mohon maaf sebelumnya jika saya telah melanggar protokol.Tweak khusus digunakan
textView.textStorage
sebagai penggantitextView.attributedText
. Sebagai programmer iOS yang masih belajar, saya tidak begitu yakin mengapa ini terjadi, tapi mungkin orang lain dapat mencerahkan kita.Modifikasi khusus dalam metode penanganan keran:
Kode lengkap di pengontrol tampilan saya
sumber
Membuat tautan khusus dan melakukan apa yang Anda inginkan dengan cepat menjadi lebih mudah dengan iOS 7. Ada contoh yang sangat bagus di Ray Wenderlich
sumber
UITextView
tautan saya tidak mendeteksi bahkan ketika saya telah menyetelnya untuk mendeteksinya melalui IB. (Saya juga membuatnya tidak dapat dipilih)Contoh WWDC 2013 :
sumber
Saya bisa menyelesaikan ini cukup sederhana dengan NSLinkAttributeName
Cepat 2
sumber
if URL.scheme == "cs"
dan direturn true
luarif
pernyataan sehinggaUITextView
dapat menanganihttps://
tautan normal yang disadapContoh lengkap untuk mendeteksi tindakan pada teks yang diatribusikan dengan Swift 3
Dan kemudian Anda bisa menangkap tindakan dengan
shouldInteractWith URL
metode delegasi UITextViewDelegate. Jadi pastikan Anda telah mengatur delegasi dengan benar.Seperti bijak, Anda dapat melakukan tindakan apa pun sesuai dengan kebutuhan Anda.
Bersulang!!
sumber
Itu mungkin dilakukan dengan
characterIndexForPoint:inTextContainer:fractionOfDistanceBetweenInsertionPoints:
. Ini akan bekerja agak berbeda dari yang Anda inginkan - Anda harus menguji apakah karakter yang disadap termasuk dalam kata ajaib . Tapi itu seharusnya tidak rumit.BTW Saya sangat merekomendasikan menonton Introducing Text Kit dari WWDC 2013.
sumber
Dengan Swift 5 dan iOS 12, Anda dapat membuat subkelas
UITextView
dan menggantipoint(inside:with:)
dengan beberapa implementasi TextKit agar hanya beberapaNSAttributedStrings
di dalamnya yang dapat di-tap.Kode berikut menunjukkan cara membuat
UITextView
yang hanya bereaksi terhadap ketukan padaNSAttributedString
s yang digarisbawahi di dalamnya:InteractiveUnderlinedTextView.swift
ViewController.swift
sumber
Yang ini mungkin berfungsi dengan baik dengan tautan pendek, multilink dalam tampilan teks. Ini bekerja dengan baik dengan iOS 6,7,8.
sumber
Gunakan ekstensi ini untuk Swift:
Tambahkan
UITapGestureRecognizer
ke tampilan teks Anda dengan pemilih berikut:sumber