我正在使用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
}
当我运行我的应用程序时。链接也将变为绿色,并且单击时会打开术语弹出窗口。
答案 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)
}