Tengo un UITextView objeto. El texto en UIView tiene un número de teléfono, correo electrónico enlace, un enlace al sitio web. Quiero mostrarles como enlaces con la siguiente funcionalidad.

Cuando alguien da golpecitos en la URL de Safari debe abrir el sitio web.
Cuando alguien pulsa en enlace del correo electrónico debe abrir con mi dirección en el campo para
Cuando alguien da golpecitos en el número de teléfono – Teléfono de la aplicación debe llamar al número

Alguien ha hecho esto antes o sabe cómo manejarlo?

Gracias,
AJ

InformationsquelleAutor AJ. | 2009-06-15

6 Comentarios

  1. 96

    Si usted está usando OS3.0

    usted puede hacerlo de la siguiente

    textview.editable = NO;
    textview.dataDetectorTypes = UIDataDetectorTypeAll;
    • Podemos hacer que de IB?
    • En XCode 4, puede configurar la Detección de tipos en IB
    • textview.seleccionable = SÍ; es necesaria para el enlace a hacer algo si pulsa sobre él, al menos a partir de iOS 7.
    • Por qué .editable = NO, Es desactivar el campo de texto para editar el contenido.
  2. 18

    Una nota en la detección de direcciones de correo electrónico: El Correo de la aplicación debe estar instalada (no en el Simulador de iOS) para los enlaces de correo electrónico para abrir un mensaje en una pantalla de redacción.

    • Buena propina. Me estaba empezando a sentirse frustrado con mi sim de prueba…
  3. 12

    Swift 3.0 +

    Como de swift 3.0, utilice el siguiente código si quieres hacerlo mediante programación.

    textview.isEditable = false
    textview.dataDetectorTypes = .all

    O si usted tiene un guión

    Cómo hacer UITextView detectar enlaces para su sitio web, correo electrónico y número de teléfono

  4. 4

    Aunque la Pregunta es super Viejo.
    Aún si alguien se enfrenta al mismo problema,

    También puede ser utilizado como un UILabel. A pesar de que
    A continuación la solución va a hacer el trabajo : [no Hay una necesidad para cualquier biblioteca..]

    Así que he usado MFMailcomposer() y UITexView [ Código Swift 3.0 – Xcode 8.3.2 ]

    Un 100% de Bloqueo de la Prueba y el Código de Trabajo se encarga de todos los casos de esquina. =D

    Paso 1.

    import MessageUI

    Paso 2. Agregar el delegado

    class ViewController: UITextViewDelegate, MFMailComposeViewControllerDelegate{

    Paso 3. Agregar el textView IBOutlet De StoryBoard

    @IBOutlet weak var infoTextView: UITextView!

    Paso 4. Llame al siguiente método en la 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
    }

    Paso 5. Implementar los métodos de delegado para 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
    }

    Paso 6. Escribir los Métodos auxiliares para abrir MailComposer y Llamar a la Aplicación

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

    Paso 7. Escribir MFMailComposer Delegado del Método

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

    Que estás Hecho… =D

    Aquí es el swift archivo para el código anterior :
    textViewWithEmailAndPhone.swift

    Establecer las siguientes propiedades para el Uso como un UILabel

    Cómo hacer UITextView detectar enlaces para su sitio web, correo electrónico y número de teléfono

    • auto.showAlert() no es más que un método escrito en otra clase, para mostrar UIAlertController con el título y el mensaje.
    • Descargo de responsabilidad : no Probar la aplicación en el Simulador puede fallar.! Funciona como un encanto en el Dispositivo.
  5. 0

    Tengo curiosidad, ¿tienes control sobre el texto que se muestra? Si es así, probablemente deberías sólo se adhieren en un UIWebView y tirar algunos enlaces en los que hay que hacer es «el camino correcto».

    • Hay una propiedad (en el SDK 3.0) dataDetectorTypes para UITextView. El que hace el trabajo de detección de enlaces en el texto. Pero estoy un poco incapaz de averiguar cómo usarlo. Para las versiones anteriores a la 3.0 que he utilizado UIButton y darles la apariencia de los enlaces. Hay eventos de toque a la que estoy llamando a un método que tiene un NSURL objeto para el sitio web. El uso de mailto:<dirección de correo electrónico aquí> abrir el correo electrónico en la aplicación Correo. Utilizando Tel:<tel número aquí> llamar al número. Pero eso es en el trabajo. Incluso después de spendin 2 horas, todavía no es capaz de averiguar cómo hacer que UITextView manejar estos chicos.
  6. 0

    El paso 1. Crear una subclase de UITextview y anular el canBecomeFirstResponder función

    KDTextView.h Código:

    @interface KDTextView : UITextView
    
    @end

    KDTextView.m Código:

    #import "KDTextView.h"
    
    //Textview to disable the selection options
    
    @implementation KDTextView
    
    - (BOOL)canBecomeFirstResponder {
        return NO;
    }
    
    @end

    El paso 2. Crear el Textview el uso de la subclase 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];

    Paso 3: Aplicar el método de delegado

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

Dejar respuesta

Please enter your comment!
Please enter your name here