Pembaruan: Dari ios10,
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction;
Dari IOS 7dan Nanti UITextView
memiliki metode delegasi:
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange *NS_DEPRECATED_IOS(7_0, 10_0, "Use textView:shouldInteractWithURL:inRange:forInteractionType: instead");*
untuk menghalangi klik ke tautan. Dan inilah cara terbaik untuk melakukannya.
Untuk ios6dan sebelumnya cara yang bagus untuk melakukannya adalah dengan membuat subkelas UIApplication
dan menimpa file-(BOOL)openURL:(NSURL *)url
@interface MyApplication : UIApplication {
}
@end
@implementation MyApplication
-(BOOL)openURL:(NSURL *)url{
if ([self.delegate openURL:url])
return YES;
else
return [super openURL:url];
}
@end
Anda perlu menerapkan openURL:
di delegasi Anda.
Sekarang, untuk memulai aplikasi dengan subkelas baru Anda UIApplication
, cari file main.m dalam proyek Anda. Dalam file kecil ini yang mem-bootstrap aplikasi Anda, biasanya ada baris ini:
int retVal = UIApplicationMain(argc, argv, nil, nil);
Parameter ketiga adalah nama kelas untuk aplikasi Anda. Jadi, ganti baris ini untuk:
int retVal = UIApplicationMain(argc, argv, @"MyApplication", nil);
Ini melakukan trik untuk saya.
UIApplication
dan mengganti implementasi openURL. Meskipun cara ini rumit (tetapi bukan tidak mungkin) untuk mereferensikan implementasi asli.Di iOS 7 atau Nanti
Anda dapat menggunakan Metode delegasi UITextView berikut:
Tampilan teks memanggil metode ini jika pengguna mengetuk atau menekan lama tautan URL. Penerapan metode ini bersifat opsional. Secara default, tampilan teks membuka aplikasi yang bertanggung jawab untuk menangani jenis URL dan meneruskannya ke URL. Anda dapat menggunakan metode ini untuk memicu tindakan alternatif, seperti menampilkan konten web di URL dalam tampilan web dalam aplikasi saat ini.
Penting:
sumber
UIWebView
jika ingin membuat teks lain sebagai tautan dan bukan URL itu sendiri. The<a>
tag masih merupakan cara terbaik untuk pergi dalam kasus itu.Untuk Swift 3
atau jika targetnya adalah> = IOS 10
sumber
Dengan Swift 5 dan iOS 12, Anda dapat menggunakan salah satu dari tiga pola berikut untuk berinteraksi dengan tautan di file
UITextView
.# 1. Menggunakan
UITextView
'sdataDetectorTypes
properti.Cara termudah untuk berinteraksi dengan nomor telepon, url, atau alamat di a
UITextView
adalah dengan menggunakandataDetectorTypes
properti. Kode contoh di bawah ini menunjukkan cara menerapkannya. Dengan kode ini, ketika pengguna mengetuk nomor telepon,UIAlertController
akan muncul.# 2. Menggunakan
UITextViewDelegate
'stextView(_:shouldInteractWith:in:interaction:)
metodeJika Anda ingin melakukan beberapa tindakan kustom alih-alih membuat
UIAlertController
munculan saat Anda mengetuk nomor telepon saat menggunakandataDetectorTypes
, Anda harusUIViewController
menyesuaikan diri denganUITextViewDelegate
protokol dan menerapkantextView(_:shouldInteractWith:in:interaction:)
. Kode di bawah ini menunjukkan bagaimana menerapkannya:# 3. Menggunakan
NSAttributedString
danNSAttributedString.Key.link
Sebagai alternatif, Anda dapat menggunakan
NSAttributedString
dan menetapkan aURL
untukNSAttributedString.Key.link
atributnya. Kode contoh di bawah ini menunjukkan kemungkinan implementasinya. Dengan kode ini, ketika pengguna mengetuk string yang diatribusikan, sebuahUIAlertController
muncul.sumber
Versi Swift:
Setup UITextView standar Anda akan terlihat seperti ini, jangan lupa delegate dan dataDetectorTypes.
Setelah kelas Anda berakhir, tambahkan bagian ini:
sumber
Cepat 4:
1) Buat kelas berikut (subclass UITextView):
2) Di mana pun Anda menyiapkan textview, lakukan ini:
Jika Anda menggunakan storyboard, pastikan textview Anda terlihat seperti ini di panel kanan inspektur identitas:
Voila! Sekarang Anda mendapatkan tautan, ketuk segera, bukan kapan metode URL shouldInteractWith URL
sumber
Saya belum mencobanya sendiri, tetapi Anda dapat mencoba menerapkan
application:handleOpenURL:
metode dalam delegasi aplikasi Anda - sepertinya semuaopenURL
permintaan melewati callback ini.sumber
Tidak yakin bagaimana Anda akan mencegat tautan data yang terdeteksi, atau jenis fungsi apa yang perlu Anda jalankan. Tapi Anda mungkin bisa menggunakan metode didBeginEditing TextField untuk menjalankan tes / scan melalui textfield jika Anda tahu apa yang Anda cari..seperti membandingkan string teks yang memenuhi format ### - ### - ####, atau mulai dengan "www." untuk mengambil bidang tersebut, tetapi Anda perlu menulis sedikit kode untuk mengendus melalui string bidang teks, menyusun kembali apa yang Anda butuhkan, dan kemudian mengekstraknya untuk digunakan fungsi Anda. Saya tidak berpikir ini akan sesulit itu, setelah Anda mempersempit apa yang Anda inginkan dan kemudian memfokuskan pernyataan if () Anda ke pola pencocokan yang sangat spesifik dari apa yang Anda butuhkan.
Dari couse ini menyiratkan bahwa pengguna akan menyentuh kotak teks untuk mengaktifkan didBeginEditing (). Jika itu bukan jenis interaksi pengguna yang Anda cari, Anda bisa menggunakan Timer pemicu, yang dimulai pada ViewDidAppear () atau lainnya berdasarkan kebutuhan dan berjalan melalui string bidang teks, kemudian di akhir Anda menjalankan melalui string bidang teks metode yang Anda buat, Anda cukup mematikan Timer kembali.
sumber
application:handleOpenURL:
dipanggil saat aplikasi lain membuka aplikasi Anda dengan membuka URL dengan skema yang didukung aplikasi Anda. Ini tidak dipanggil saat aplikasi Anda mulai membuka URL.Saya pikir satu-satunya cara untuk melakukan apa yang diinginkan Vladimir adalah dengan menggunakan UIWebView, bukan UITextView. Jadikan pengontrol tampilan Anda mengimplementasikan UIWebViewDelegate, setel delegasi UIWebView ke pengontrol tampilan, dan di implementasi pengontrol tampilan
webView:shouldStartLoadWithRequest:navigationType:
untuk membuka[request URL]
dalam tampilan alih-alih menutup aplikasi Anda dan membukanya di Mobile Safari.sumber