我有一个 UITextView 对象。UIView 中的文字有电话号码、邮件链接、网站链接。我想将它们显示为具有以下功能的链接。
当有人点击 URL 时 - Safari 应该会打开该网站。当有人点击电子邮件链接时 - 邮件应在字段中打开我的地址当有人点击电话号码时 - 电话应用程序应拨打该号码
有没有人这样做过或知道如何处理它?
谢谢, AJ
我有一个 UITextView 对象。UIView 中的文字有电话号码、邮件链接、网站链接。我想将它们显示为具有以下功能的链接。
当有人点击 URL 时 - Safari 应该会打开该网站。当有人点击电子邮件链接时 - 邮件应在字段中打开我的地址当有人点击电话号码时 - 电话应用程序应拨打该号码
有没有人这样做过或知道如何处理它?
谢谢, AJ
如果您使用的是 OS3.0
你可以这样做
textview.editable = NO;
textview.dataDetectorTypes = UIDataDetectorTypeAll;
关于检测电子邮件地址的注意事项:必须安装邮件应用程序(它不在 iOS 模拟器上)才能打开电子邮件链接以打开邮件撰写屏幕。
虽然问题是超级老。如果有人面临同样的问题,
它也可以用作UILabel。虽然下面的解决方案可以完成这项工作:[不需要任何库..]
所以我使用了 MFMailcomposer()和UIExView [代码在 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
步骤 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;
}
我很好奇,您可以控制显示的文字吗?如果是这样,您可能应该将其粘贴在 UIWebView 中并在其中添加一些链接以“以正确的方式”进行操作。
斯威夫特 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 下划线、如何为您的文本赋予自定义颜色、自定义字体、如何在点击电话或电子邮件时调用函数等。
希望这将帮助某人节省宝贵的时间。快乐编码:)
如果您想自动检测链接、电子邮件等,请确保“ isSelectable ”设置为 true。
textview.isSelectable = true
textview.editable = false
textview.dataDetectorTypes = .all