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

0voto

Prashant Gaikwad Points 291

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

Étapes - 1. Définissez le délégué à votre champ de texte et n'oubliez pas de mettre en œuvre UITextViewDelegate. 2. Prenez la sortie textView - @IBOutlet weak var videoDescTextView : UITextView ! 3. Ajoutez les deux fonctions ci-dessus. Cette fonction montre comment détecter les numéros de téléphone, les adresses e-mail à partir de textView, comment souligner votre adresse e-mail, comment donner une couleur personnalisée à votre texte, une police personnalisée, comment appeler une fonction lorsque vous tapez sur le téléphone ou l'e-mail, etc.

J'espère que cela aidera quelqu'un à gagner un temps précieux. Bon codage :)

0voto

aqsa arshad Points 554

Si vous voulez détecter automatiquement les liens, les courriels, etc., assurez-vous que " isSelectable "est défini comme vrai.

textview.isSelectable = true
textview.editable = false
textview.dataDetectorTypes = .all

0voto

Ed Marty Points 24861

Je suis curieux, avez-vous un contrôle sur le texte affiché ? Si c'est le cas, vous devriez probablement le placer dans une UIWebView et y insérer quelques liens pour faire les choses "comme il faut".

1 votes

Il existe une propriété (dans le SDK 3.0) dataDetectorTypes pour UITextView. Elle permet de détecter les liens dans le texte. Mais je ne parviens pas à comprendre comment l'utiliser. Pour les versions antérieures à 3.0, j'ai utilisé UIButton et les ai fait ressembler à des liens. Sur leur événement tactile, j'appelle une méthode qui a un objet NSURL vers le site web. L'utilisation de mailto:<adresse e-mail ici> ouvrirait l'e-mail dans l'application Mail. L'utilisation de Tel:<numéro de téléphone ici> appellerait le numéro. Mais c'est la solution de contournement. Même après avoir passé 2 heures, je ne suis toujours pas capable de comprendre comment faire en sorte que UITextView gère ces types.

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