61 votes

Comment faire en sorte que UITextView détecte les liens pour le site Web, le courrier et le numéro de téléphone ?

J'ai un objet UITextView. Le texte de l'UIView contient un numéro de téléphone, un lien vers un courrier électronique et un lien vers un site Web. Je veux les afficher comme des liens avec la fonctionnalité suivante.

Lorsque quelqu'un tape sur l'URL, Safari doit ouvrir le site web. Lorsque quelqu'un clique sur le lien e-mail - Mail devrait s'ouvrir avec mon adresse dans le champ. Lorsque quelqu'un tape sur un numéro de téléphone, l'application Téléphone doit appeler ce numéro.

Quelqu'un a-t-il déjà fait cela ou sait-il comment s'y prendre ?

Merci, AJ

109voto

Si vous utilisez OS3.0

vous pouvez procéder de la manière suivante

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

18voto

Andrew Hershberger Points 1491

Une note sur la détection des adresses e-mail : L'application Mail doit être installée (elle ne l'est pas sur le simulateur iOS) pour que les liens vers les adresses électroniques ouvrent un écran de composition de message.

0 votes

Qu'en est-il du cas où un client de messagerie tiers de niveau iOS a été sélectionné ?

16voto

Fangming Points 10276

Swift 3.0 +

À partir de swift 3.0, utilisez le code suivant si vous voulez le faire de manière programmatique.

textview.isEditable = false
textview.dataDetectorTypes = .all

Ou si vous avez un storyboard

enter image description here

8voto

Yash Bedi Points 643

Bien que la question soit très ancienne. Mais si quelqu'un est confronté au même problème,

Il peut également être utilisé comme UILabel . Bien que La solution ci-dessous fera l'affaire : [Il n'y a pas besoin d'une bibliothèque..]

J'ai donc utilisé MFMailcomposer() y UITexView [ Le code est en Swift 3.0 - Xcode 8.3.2 ]

Un code 100% à l'épreuve des pannes et qui fonctionne gère tous les cas de figure. =D

Étape 1.

import MessageUI

Étape 2. Ajouter le délégué

class ViewController: UITextViewDelegate, MFMailComposeViewControllerDelegate{

Étape 3. Ajouter l'IBOutlet textView du StoryBoard

@IBOutlet weak var infoTextView: UITextView!

Étape 4. Appelez la méthode ci-dessous dans votre 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
}

Étape 5. Implémenter des méthodes déléguées pour 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
}

Étape 6. Ecrire les méthodes d'aide pour ouvrir MailComposer et appeler l'application.

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)

}

Étape 7. Écrire la méthode déléguée de 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)
}

C'est ça, c'est fait... =D

Voici le fichier swift pour le code ci-dessus : textViewWithEmailAndPhone.swift

Définissez les propriétés suivantes pour l'utiliser en tant que UILabel

Here's the image for that..

1voto

Dhariwal_Kuldeep Points 128

Étape 1. Créez une sous-classe de UITextview et remplacez la fonction canBecomeFirstResponder fonction

KDTextView.h Code :

@interface KDTextView : UITextView

@end

KDTextView.m Code :

#import "KDTextView.h"

// Textview to disable the selection options

@implementation KDTextView

- (BOOL)canBecomeFirstResponder {
    return NO;
}

@end

Étape 2. Créez le Textview en utilisant la sous-classe 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];

Étape 3 : Implémenter la méthode du délégué

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X