Как заставить UITextView обнаруживать ссылки на сайт, почту и номер телефона - PullRequest
50 голосов
/ 15 июня 2009

У меня есть объект UITextView. Текст в UIView имеет номер телефона, ссылку на почту, ссылку на сайт. Я хочу показать их как ссылки со следующими функциями.

Когда кто-то нажимает на URL - Safari должен открыть веб-сайт. Когда кто-то нажимает на ссылку электронной почты - должна открыться почта с моим адресом в поле Когда кто-то нажимает на телефонный номер - приложение телефона должно позвонить по номеру

Кто-нибудь делал это раньше или знает, как с этим справиться?

Спасибо, AJ

Ответы [ 6 ]

96 голосов
/ 09 августа 2009

Если вы используете OS3.0

вы можете сделать это следующим образом

textview.editable = NO;
textview.dataDetectorTypes = UIDataDetectorTypeAll;
18 голосов
/ 18 ноября 2011

Примечание по обнаружению адресов электронной почты: приложение Mail должно быть установлено (оно не на iOS Simulator), чтобы ссылки электронной почты открывали экран создания сообщения.

12 голосов
/ 25 сентября 2017

Swift 3.0 +

Начиная с swift 3.0, используйте следующий код, если вы хотите сделать это программно.

textview.isEditable = false
textview.dataDetectorTypes = .all

Или, если у вас есть раскадровка

enter image description here

3 голосов
/ 14 сентября 2017

Хотя вопрос супер старый. Тем не менее, если кто-то сталкивается с той же проблемой,

Также его можно использовать как UILabel . Хоть Ниже решение будет делать эту работу: [Нет необходимости в какой-либо библиотеке ..]

Итак, я использовал MFMailcomposer () и UITexView [Код в Swift 3.0 - Xcode 8.3.2]

100% защита от сбоев и рабочий код. Обрабатывает все угловые случаи. = D

Шаг 1.

import MessageUI

Шаг 2. Добавить делегата

class ViewController: UITextViewDelegate, MFMailComposeViewControllerDelegate{

Шаг 3. Добавить текстовый IBOutlet из StoryBoard

@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 и вызова приложения

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

Here's the image for that..

0 голосов
/ 10 июня 2016

Шаг 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. Создание Textview с использованием подкласса KDTextView

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;
}
0 голосов
/ 15 июня 2009

Мне любопытно, у вас есть контроль над отображаемым текстом? Если это так, вам, вероятно, следует просто вставить его в UIWebView и добавить туда несколько ссылок, чтобы сделать это «правильным образом».

...