繁体   English   中英

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

[英]How to make UITextView detect links for website, mail and phone number

我有一个UITextView object。UIView里面的文字有电话号码,邮件链接,网址链接。 我想将它们显示为具有以下功能的链接。

当有人点击 URL - Safari 应该打开网站。 当有人点击 email 链接时 - 邮件应在字段中打开我的地址当有人点击电话号码时 - 电话应用程序应拨打该号码

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

谢谢,阿杰

如果您使用的是 OS3.0

你可以像下面这样

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

关于检测电子邮件地址的注意事项:必须安装邮件应用程序(它不在 iOS 模拟器上),电子邮件链接才能打开邮件撰写屏幕。

斯威夫特 3.0 +

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

textview.isEditable = false
textview.dataDetectorTypes = .all

或者如果你有一个故事板

在此处输入图片说明

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

它也可以用作UILabel 虽然下面的解决方案可以完成这项工作: [不需要任何图书馆..]

所以我使用了MFMailcomposer()UITexView [代码在 Swift 3.0 - Xcode 8.3.2]

100% 防碰撞和工作代码处理所有极端情况。 =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 的 Delegate 方法

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

这是图片..

Step 1. 创建 UITextview 的子类并覆盖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 创建 Textview

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];

第三步:实现委托方法

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

斯威夫特 4.2 Xcode 10.1

func setupContactUsTextView() {
        let text = NSMutableAttributedString(string: "Love your App, but need more help? Text, Call (123) 456-1234 or email ")
        if let font = UIFont(name: "Calibri", size: 17) {
            text.addAttribute(NSAttributedStringKey.font,
                              value: font,
                              range: NSRange(location: 0, length: text.length))
        } else {
            text.addAttribute(NSAttributedStringKey.font,
                              value: UIFont.systemFont(ofSize: 17),
                              range: NSRange(location: 0, length: text.length))
        }
        text.addAttribute(NSAttributedStringKey.foregroundColor,
                          value: UIColor.init(red: 112/255, green: 112/255, blue: 112/255, alpha: 1.0),
                          range: NSRange(location: 0, length: text.length))
        text.addAttribute(NSAttributedStringKey.link, value: "tel://", range: NSRange(location: 49, length: 15))
        let interactableText = NSMutableAttributedString(string: "contact@abc.com")
        if let font = UIFont(name: "Calibri", size: 17) {
            interactableText.addAttribute(NSAttributedStringKey.font,
                                          value: font,
                                          range: NSRange(location: 0, length: interactableText.length))
        } else {
            interactableText.addAttribute(NSAttributedStringKey.font,
                                          value: UIFont.systemFont(ofSize: 17),
                                          range: NSRange(location: 0, length: interactableText.length))
        }
        interactableText.addAttribute(NSAttributedStringKey.link,
                                      value: "contact@abc.com",
                                      range: NSRange(location: 0, length: interactableText.length))
        interactableText.addAttribute(NSAttributedStringKey.underlineStyle,
                                      value: NSUnderlineStyle.styleSingle.rawValue,
                                      range: NSRange(location: 0, length: interactableText.length))
        text.append(interactableText)
        videoDescTextView.attributedText = text
        videoDescTextView.textAlignment = .center
        videoDescTextView.isEditable = false
        videoDescTextView.isSelectable = true
        videoDescTextView.delegate = self
    }

    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
        if (characterRange.location > 48 && characterRange.location < 65){
            print("open phone")
        }else{
            print("open gmail")
        }
        return false
    }

步骤 - 1. 将委托设置为您的文本字段,不要忘记实现 UITextViewDelegate 2. 使用 textView 插座 - @IBOutlet weak var videoDescTextView: UITextView! 3. 添加上面给出的这两个函数。 该函数展示了如何检测电话号码、textView 中的电子邮件、如何为电子邮件 ID 加下划线、如何为文本自定义颜色、自定义字体、如何在点击电话或电子邮件时调用函数等。

希望这能帮助某人节省宝贵的时间。 快乐编码:)

如果您想自动检测链接,email 等请确保“ isSelectable ”设置为 true。

textview.isSelectable = true
textview.editable = false
textview.dataDetectorTypes = .all

我很好奇,你能控制显示的文字吗? 如果是这样,您可能应该将其粘贴在 UIWebView 中并在其中放置一些链接以“以正确的方式”执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM