带有可点击链接或电话号码的UITextView和Swift中的自定义属性字符串

时间:2019-05-05 10:47:40

标签: ios swift uitextview nsattributedstring

我正在使用iOS应用程序。在我的应用中,我正在UITextView中显示产品的详细信息。详细信息可能包含电话号码,电子邮件地址或网站链接。我可以使用UITextViews属性使其可单击。同样在我的UITextView中,我想在最后一个位置附加'Terms&Condition'字符串,当单击它时,我想在弹出窗口中显示条款和条件。那也是我对NSAttributed字符串所做的。但是问题是当我单击URL或电话号码或自定义的属性字符串时,它显示弹出的术语。如何区分点击次数,也就是说,如果我单击应该在浏览器中打开的网站,或者如果是电话号码,请提示我拨打该号码,如果是条款和条件,请打开弹出窗口。请帮我。我尝试了所有方法。在iOS中可以吗?
这是我添加

的代码
let str = "\(offer_desc) t&c"  //t&c is the clickbale string added to the actaul offer description

let attributedString = NSMutableAttributedString(string: str, attributes: [NSAttributedStringKey.font: UIFont(name: "Avenir-Medium", size: 12)])

let foundRange = attributedString.mutableString.range(of: "t&c") 
attributedString.addAttribute(NSAttributedStringKey.link, value: "", range: foundRange)

descriptionTextView.linkTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue : UIColor.green]

descriptionTextView.attributedText = attributedString


func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {

    self.showTermsCondition(self)
    return false
}

当我运行我的应用程序时。链接也将变为绿色,并且单击时会打开术语弹出窗口。

enter image description here

2 个答案:

答案 0 :(得分:0)

首先,您想在一个textview中执行此操作吗?如果不是,则可以使用stackview并将textview放入其中。这样,您就可以通过手势识别器完成自己想要做的事情。

如果您想在一个textview上进行操作,也许您可​​以共享一种设计来更清楚地解决问题。

答案 1 :(得分:0)

是的,我已解决问题。我们需要做的是,像这样检查UITextView回调中的URL。

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
    if URL.absoluteString == ""  { //
       self.showTermsCondition(self)
       return false
    }

    return true //System will take care according to URL type, weblink, email or phone number
}

或者您也可以这样做,

@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
}

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)

}