如何使UITextView检测网站,邮件和电话号码的链接

我有一个UITextView对象。 UIView中的文本有电话号码,邮件链接,网站链接。 我想把它们显示为以下function的链接。

当有人点击url – Safari应该打开网站。 当有人点击电子邮件链接 – 邮件应打开与我的地址在现场当有人点击电话号码 – 电话应用程序应该打电话号码

有没有人以前做过或知道如何处理?

谢谢,AJ

如果你使用的是OS3.0

你可以像下面这样做

textview.editable = NO; textview.dataDetectorTypes = UIDataDetectorTypeAll; 

有关检测电子邮件地址的注意事项:必须安装邮件应用程序(不在iOS模拟器上)才能打开邮件撰写画面。

我很好奇,你能控制显示的文字吗? 如果是这样的话,你应该把它放在一个UIWebView中,然后在那里扔一些链接来“正确的”。

第1步。创buildUITextview的子类并重写canBecomeFirstResponder函数

KDTextView.h代码:

 @interface KDTextView : UITextView @end 

KDTextView.m代码:

 #import "KDTextView.h" // Textview to disable the selection options @implementation KDTextView - (BOOL)canBecomeFirstResponder { return NO; } @end 

第2步。使用子类KDTextView创buildTextview

 KDTextView*_textView = [[KDTextView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; [_textView setScrollEnabled:false]; [_textView setEditable:false]; _textView.delegate = self; [_textView setDataDetectorTypes:UIDataDetectorTypeAll]; _textView.selectable = YES; _textView.delaysContentTouches = NO; _textView.userInteractionEnabled = YES; [self.view addSubview:_textView]; 

第3步:实现委托方法

 - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange { return true; } 

虽然这个问题是超古老的。 如果有人面临同样的问题,

也可以作为一个UILabel使用下面的解决scheme将完成这项工作: [有没有需要任何图书馆..]

所以我用MFMailcomposer()UITexView [代码是在Swift 3.0 – Xcode 8.3.2]

100%防撞和工作代码处理所有的angular落情况。 = d

步骤1。

 import MessageUI 

第2步。添加委托

class ViewController: UITextViewDelegate, MFMailComposeViewControllerDelegate{

第3步。从StoryBoard中添加textView IBOutlet

 @IBOutlet weak var infoTextView: UITextView! 

第4步。在你的viewDidload()中调用下面的方法

 func addInfoToTextView() { let attributedString = NSMutableAttributedString(string: "For further info call us on : \(phoneNumber)\nor mail us at : \(email)") attributedString.addAttribute(NSLinkAttributeName, value: "tel://", range: NSRange(location: 30, length: 10)) attributedString.addAttribute(NSLinkAttributeName, value: "mailto:", range: NSRange(location: 57, length: 18)) self.infoTextView.attributedText = attributedString self.infoTextView.linkTextAttributes = [NSForegroundColorAttributeName:UIColor.blue, NSUnderlineStyleAttributeName:NSNumber(value: 0)] self.infoTextView.textColor = .white self.infoTextView.textAlignment = .center self.infoTextView.isEditable = false self.infoTextView.dataDetectorTypes = UIDataDetectorTypes.all self.infoTextView.delegate = self } 

第5步。为TextView实现委托方法

 @available(iOS, deprecated: 10.0) func textView(_ textView: UITextView, shouldInteractWith url: URL, in characterRange: NSRange) -> Bool { if (url.scheme?.contains("mailto"))! && characterRange.location > 55{ openMFMail() } if (url.scheme?.contains("tel"))! && (characterRange.location > 29 && characterRange.location < 39){ callNumber() } return false } //For iOS 10 @available(iOS 10.0, *) func textView(_ textView: UITextView, shouldInteractWith url: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { if (url.scheme?.contains("mailto"))! && characterRange.location > 55{ openMFMail() } if (url.scheme?.contains("tel"))! && (characterRange.location > 29 && characterRange.location < 39){ callNumber() } return false } 

第6步。编写助手方法打开MailComposer和Call App

 func callNumber() { if let phoneCallURL = URL(string: "tel://\(phoneNumber)") { let application:UIApplication = UIApplication.shared if (application.canOpenURL(phoneCallURL)) { let alert = UIAlertController(title: "Call", message: "\(phoneNumber)", preferredStyle: UIAlertControllerStyle.alert) if #available(iOS 10.0, *) { alert.addAction(UIAlertAction(title: "Call", style: .cancel, handler: { (UIAlertAction) in application.open(phoneCallURL, options: [:], completionHandler: nil) })) } else { alert.addAction(UIAlertAction(title: "Call", style: .cancel, handler: { (UIAlertAction) in application.openURL(phoneCallURL) })) } alert.addAction(UIAlertAction(title: "cancel", style: .default, handler: nil)) self.present(alert, animated: true, completion: nil) } } else { self.showAlert("Couldn't", message: "Call, cannot open Phone Screen") } } func openMFMail(){ let mailComposer = MFMailComposeViewController() mailComposer.mailComposeDelegate = self mailComposer.setToRecipients(["\(email)"]) mailComposer.setSubject("Subject..") mailComposer.setMessageBody("Please share your problem.", isHTML: false) present(mailComposer, animated: true, completion: nil) } 

第7步。写MFMailComposer的委托方法

 func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { switch result { case .cancelled: print("Mail cancelled") case .saved: print("Mail saved") case .sent: print("Mail sent") case .failed: print("Mail sent failure: \(String(describing: error?.localizedDescription))") default: break } controller.dismiss(animated: true, completion: nil) } 

就是这样你做完了… = D

这是上面代码的swift文件: textViewWithEmailAndPhone.swift

将以下属性设置为使用它作为UILabel

这是那个图片

Swift 3.0

从swift 3.0开始,如果要以编程方式执行,请使用以下代码。

 textview.isEditable = false textview.dataDetectorTypes = .all 

或者如果你有一个故事板

在这里输入图像说明