Itu sepele untuk membuat hyperlink yang dapat diklik dalam UITextView
. Anda cukup mengatur kotak centang "deteksi tautan" pada tampilan di IB, dan mendeteksi tautan HTTP dan mengubahnya menjadi hyperlink.
Namun, itu masih berarti bahwa apa yang dilihat pengguna adalah tautan "mentah". File RTF dan HTML memungkinkan Anda mengatur string yang dapat dibaca pengguna dengan tautan "di belakang".
Mudah untuk memasang teks yang dikaitkan ke tampilan teks (atau a UILabel
atau UITextField
, dalam hal ini.) Namun, ketika teks yang dikaitkan itu menyertakan tautan, itu tidak dapat diklik.
Apakah ada cara untuk membuat teks yang dapat dibaca pengguna dapat diklik dalam UITextView
, UILabel
atau UITextField
?
Markupnya berbeda pada SO, tapi di sini ada ide umum. Yang saya inginkan adalah teks seperti ini:
Morf ini dihasilkan dengan Penari Wajah , Klik untuk melihat di app store.
Satu-satunya yang bisa saya dapatkan adalah ini:
Morf ini dihasilkan dengan Penari Wajah, Klik pada http://example.com/facedancer untuk melihat di app store.
Jawaban:
Gunakan NSMutableAttributedString .
Edit :
Ini bukan langsung tentang pertanyaan tetapi hanya untuk mengklarifikasi,
UITextField
danUILabel
tidak mendukung membuka URL. Jika Anda ingin menggunakanUILabel
tautan, Anda dapat memeriksa TTTAttributedLabel .Anda juga harus menetapkan
dataDetectorTypes
nilai AndaUITextView
keUIDataDetectorTypeLink
atauUIDataDetectorTypeAll
untuk membuka URL ketika diklik. Atau Anda dapat menggunakan metode delegasi seperti yang disarankan dalam komentar.sumber
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
NSURL
. ----[str addAttribute: NSLinkAttributeName value: [NSURL URLWithString:@"http://www.google.com"] range: NSMakeRange(0, str.length)];
NSAttributedString.h
UIKIT_EXTERN NSString * const NSLinkAttributeName NS_AVAILABLE(10_0, 7_0); // NSURL (preferred) or NSString
Saya menemukan ini sangat berguna tetapi saya perlu melakukannya di beberapa tempat jadi saya telah membungkus pendekatan saya dalam ekstensi sederhana untuk
NSMutableAttributedString
:Cepat 3
Cepat 2
Contoh penggunaan:
Objektif-C
Saya baru saja mencapai persyaratan untuk melakukan hal yang sama dalam proyek Objective-C murni, jadi inilah kategori Objective-C.
Contoh penggunaan:
Pastikan bahwa atribut Perilaku NSTextField ditetapkan sebagai Dapat Dipilih.
sumber
Saya baru saja membuat subkelas UILabel untuk secara khusus menangani kasus penggunaan tersebut. Anda dapat menambahkan banyak tautan dengan mudah dan menentukan penangan yang berbeda untuknya. Ini juga mendukung menyoroti tautan yang ditekan ketika Anda menyentuh untuk umpan balik sentuhan. Silakan merujuk ke https://github.com/null09264/FRHyperLabel .
Dalam kasus Anda, kodenya mungkin seperti ini:
Contoh Screenshot (pawang diatur untuk memunculkan peringatan alih-alih membuka url dalam kasus ini)
sumber
- (void)setLinkForRange:(NSRange)range withLinkHandler:(void(^)(FRHyperLabel *label, NSRange selectedRange))handler;
sebagai gantinya. Silakan merujuk ke readme di halaman github.Perbaikan kecil untuk solusi ujell: Jika Anda menggunakan NSURL alih-alih NSString, Anda dapat menggunakan URL apa pun (mis. Url khusus)
Selamat bersenang-senang!
sumber
Swift 4:
Swift 3.1:
sumber
Saya juga memiliki persyaratan yang sama, awalnya saya menggunakan UILabel dan kemudian saya menyadari bahwa UITextView lebih baik. Saya membuat UITextView berperilaku seperti UILabel dengan menonaktifkan interaksi dan menggulir dan membuat metode kategori untuk
NSMutableAttributedString
mengatur tautan ke teks sama seperti apa yang telah dilakukan Karl (+1 untuk itu) ini adalah versi objektif sayaAnda dapat menggunakan delegasi di bawah ini untuk menangani tindakan
sumber
NSForegroundColorAttributeName
dalam kisaran di manaNSLinkAttributeName
diterapkan tidak bekerja. Tidak peduli apa, yanglinkTextAttributes
dariUITextView
diterapkan sebagai gantinya. ApakahNSForegroundColorAttributeName
berhasil untuk Anda?linkTextAttributes
hal yang sama? atau mungkintintColor
? Apakah Anda dapat membuat 2 tautan muncul dalam warna berbeda di tampilan teks yang sama?Gunakan UITextView mendukung Tautan yang dapat diklik. Buat string yang dikaitkan menggunakan kode berikut
Kemudian atur teks UITextView sebagai berikut
Pastikan Anda mengaktifkan perilaku "Selectable" dari UITextView di XIB.
sumber
Selectable
itu penting!Inti dari pertanyaan saya adalah bahwa saya ingin dapat membuat tautan yang dapat diklik dalam tampilan teks / bidang / label tanpa harus menulis kode khusus untuk memanipulasi teks dan menambahkan tautan. Saya ingin ini berbasis data.
Saya akhirnya menemukan cara melakukannya. Masalahnya adalah bahwa IB tidak menghormati tautan yang disematkan.
Selain itu, versi iOS
NSAttributedString
tidak memungkinkan Anda menginisialisasi string yang dikaitkan dari file RTF. Versi OS XNSAttributedString
memang memiliki initializer yang mengambil file RTF sebagai input.NSAttributedString
sesuai dengan protokol NSCoding, sehingga Anda dapat mengubahnya ke / dari NSDataSaya membuat alat baris perintah OS X yang mengambil file RTF sebagai input dan menghasilkan file dengan ekstensi .data yang berisi NSData dari NSCoding. Saya kemudian memasukkan file data ke proyek saya dan menambahkan beberapa baris kode yang memuat teks ke dalam tampilan. Kode ini terlihat seperti ini (proyek ini di Swift):
Untuk aplikasi yang menggunakan banyak teks berformat, saya membuat aturan build yang memberi tahu Xcode bahwa semua file .rtf dalam folder yang diberikan adalah sumber dan file .data adalah output. Setelah saya melakukannya, saya cukup menambahkan file .rtf ke direktori yang ditunjuk, (atau mengedit file yang ada) dan proses build mengetahui bahwa file tersebut baru / diperbarui, menjalankan alat baris perintah, dan menyalin file ke dalam bundel aplikasi. Itu bekerja dengan indah.
Saya menulis posting blog yang terhubung ke proyek sampel (Swift) yang menunjukkan teknik ini. Anda bisa melihatnya di sini:
Membuat URL yang dapat diklik di UITextField yang terbuka di aplikasi Anda
sumber
Swift 3 contoh untuk mendeteksi tindakan pada keran teks yang dikaitkan
https://stackoverflow.com/a/44226491/5516830
Seperti bijaksana Anda dapat menambahkan tindakan yang Anda inginkan dengan
shouldInteractWith URL
metode UITextFieldDelegate.Bersulang!!
sumber
Jawaban cepat menggunakan UITextView, bukan UILabel. Anda harus mengaktifkan
Selectable
dan menonaktifkanEditable
.Kemudian nonaktifkan indikator gulir dan memantul.
Solusi saya menggunakan
NSMutableAttributedString
dari string htmlNSHTMLTextDocumentType
sumber
NSAttributedString
, menjadikannya sebagaiattributedText
milik sayaUITextView
dan hyperlink berfungsi! Ini akan menjadi banyak pekerjaan untuk menemukan jangkauan setiap hyperlink dan mengaturnya menggunakan atribut.Saya telah menulis sebuah metode, yang menambahkan tautan (linkString) ke string (fullString) dengan url tertentu (urlString):
Anda harus menyebutnya seperti ini:
sumber
Saya harus tetap menggunakan UILabel murni, yang disebut ini dari pengenal keran saya (ini didasarkan pada respons malex di sini: Indeks karakter pada titik sentuh untuk UILabel )
sumber
Memperbarui:
Ada 2 bagian penting dari pertanyaan saya:
Ternyata iOS 7 menambahkan kemampuan untuk memuat teks yang dikaitkan dari
NSData
.Saya membuat subkelas kustom
UITextView
yang memanfaatkan@IBInspectable
atribut dan memungkinkan Anda memuat konten dari file RTF langsung di IB. Anda cukup mengetikkan nama file ke IB dan kelas kustom melakukan sisanya.Berikut detailnya:
Di iOS 7,
NSAttributedString
diperoleh metodeinitWithData:options:documentAttributes:error:
. Metode itu memungkinkan Anda memuat NSAttributedString dari objek NSData. Pertama-tama Anda dapat memuat file RTF ke NSData, lalu gunakaninitWithData:options:documentAttributes:error:
untuk memuat NSData itu ke dalam tampilan teks Anda. (Perhatikan bahwa ada juga metodeinitWithFileURL:options:documentAttributes:error:
yang akan memuat string yang dikaitkan langsung dari file, tetapi metode itu sudah usang di iOS 9. Lebih aman untuk menggunakan metode iniinitWithData:options:documentAttributes:error:
, yang tidak usang.Saya ingin metode yang memungkinkan saya memasang tautan yang dapat diklik ke dalam tampilan teks saya tanpa harus membuat kode khusus untuk tautan yang saya gunakan.
Solusi yang saya buat adalah membuat subkelas kustom dari UITextView yang saya panggil
RTF_UITextView
dan memberinya@IBInspectable
properti yang disebutRTF_Filename
. Menambahkan@IBInspectable
atribut ke properti menyebabkan Interface Builder memaparkan properti itu di "Atribut Inspektur." Anda kemudian dapat menetapkan nilai itu dari IB tanpa kode khusus.Saya juga menambahkan
@IBDesignable
atribut ke kelas khusus saya. The@IBDesignable
atribut memberitahu Xcode bahwa itu harus menginstal salinan menjalankan adat pandang kelas Anda menjadi Antarmuka pembangun sehingga Anda dapat melihatnya dalam tampilan grafis dari hierarki tampilan Anda. () Sayangnya, untuk kelas ini,@IBDesignable
properti tampaknya serpihan. Ini berfungsi ketika saya pertama kali menambahkannya, tetapi kemudian saya menghapus isi teks biasa dari tampilan teks saya dan tautan yang dapat diklik dalam tampilan saya hilang dan saya belum bisa mendapatkannya kembali.)Kode untuk saya
RTF_UITextView
sangat sederhana. Selain menambahkan@IBDesignable
atribut danRTF_Filename
properti dengan@IBInspectable
atribut, saya menambahkandidSet()
metode keRTF_Filename
properti. ThedidSet()
Metode dipanggil setiap saat nilaiRTF_Filename
perubahan properti. Kode untukdidSet()
metode ini cukup sederhana:Perhatikan bahwa jika properti @IBDesignable tidak akan memungkinkan Anda untuk melihat pratinjau teks gaya Anda di pembuat antarmuka, maka mungkin lebih baik untuk mengatur kode di atas sebagai ekstensi UITextView daripada subkelas kustom. Dengan begitu Anda bisa menggunakannya dalam tampilan teks apa pun tanpa harus mengubah tampilan teks ke kelas kustom.
Lihat jawaban saya yang lain jika Anda perlu mendukung versi iOS sebelum iOS 7.
Anda dapat mengunduh proyek sampel yang menyertakan kelas baru ini dari gitHub:
Proyek demo DatesInSwift di Github
sumber
Temukan saja solusi bebas kode untuk UITextView:
Aktifkan opsi Deteksi-> Tautan, URL dan juga email akan terdeteksi dan dapat diklik!
sumber
Versi Swift:
sumber
Gunakan UITextView dan atur dataDetectorTypes for Link.
seperti ini:
Jika Anda ingin mendeteksi tautan, nomor telepon, alamat dll. Maka
sumber
http://somedomain/someurl?param=value
Tambahan cepat untuk deskripsi asli Duncan C vis-á-vie perilaku IB. Dia menulis: "Ini sepele untuk membuat hyperlink dapat diklik dalam UITextView. Anda cukup mengatur kotak centang" deteksi tautan "pada tampilan di IB, dan itu mendeteksi tautan http dan mengubahnya menjadi hyperlink."
Pengalaman saya (setidaknya dalam xcode 7) adalah bahwa Anda juga harus menghapus perilaku "Editable" agar url terdeteksi & diklik.
sumber
Jika Anda mengalami masalah dengan apa yang telah disediakan @Karl Nosworthy dan @esilver di atas, saya telah memperbarui ekstensi NSMutableAttributedString ke versi Swift 4-nya.
sumber
Pustaka hebat dari @AliSoftware
OHAttributedStringAdditions
memudahkan untuk menambahkan tautan diUILabel
sini adalah dokumentasi: https://github.com/AliSoftware/OHAttributedStringAdditions/wiki/link-in-UILabelsumber
Jika Anda ingin menggunakan NSLinkAttributeName di UITextView, maka Anda dapat mempertimbangkan menggunakan pustaka AttributedTextView. Ini adalah subclass UITextView yang membuatnya sangat mudah untuk menangani ini. Untuk info lebih lanjut, lihat: https://github.com/evermeer/AttributedTextView
Anda dapat membuat bagian mana pun dari teks berinteraksi seperti ini (di mana textView1 adalah UITextView IBoutlet):
Dan untuk menangani tagar dan sebutan Anda dapat menggunakan kode seperti ini:
sumber
jika Anda ingin substring aktif di UITextView Anda, maka Anda dapat menggunakan TextView yang diperluas ... pendek dan sederhana. Anda dapat mengeditnya sesuka Anda.
hasil:
kode: https://github.com/marekmand/ActiveSubstringTextView
sumber
POIN PENTING:
sumber