Es posible realizar la acción personalizada cuando el usuario toque detectadas enlace telefónico en UITextView. Por favor, no consejos para utilizar UIWebView lugar.

Y por favor, no simplemente repetir el texto de apple clases de referencia
– sin duda ya he leído.

Gracias.

InformationsquelleAutor Vladimir | 2010-03-30

9 Comentarios

  1. 135

    Actualización: Desde ,

    - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction;

    De y más Tarde UITextView tiene el método delegado:

    - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange *NS_DEPRECATED_IOS(7_0, 10_0, "Use textView:shouldInteractWithURL:inRange:forInteractionType: instead");*

    para interceptar los clics a enlaces. Y esta es la mejor manera de hacerlo.

    Para y antes una buena manera de hacer esto es mediante la creación de subclases UIApplication y sobrescribir el -(BOOL)openURL:(NSURL *)url

    @interface MyApplication : UIApplication {
    
    }
    
    @end
    
    @implementation MyApplication
    
    
    -(BOOL)openURL:(NSURL *)url{
        if  ([self.delegate openURL:url])
             return YES;
        else
             return [super openURL:url];
    }
    @end

    Necesitará para implementar openURL: en su delegado.

    Ahora, a tener el inicio de la aplicación con su nueva subclase de UIApplication, busque el archivo principal.m en su proyecto. En este pequeño archivo que se levanta a su aplicación, no es generalmente esta línea:

    int retVal = UIApplicationMain(argc, argv, nil, nil);

    El tercer parámetro es el nombre de la clase para su aplicación. Así, la sustitución de esta línea para:

    int retVal = UIApplicationMain(argc, argv, @"MyApplication", nil);

    Esto hizo que el truco para mí.

    • En última respuesta real! Simple y genial idea. Gracias, funciona. Fue hace mucho tiempo, así que me las he arreglado sin ella ya. Todavía puede ayudar en el futuro. Pequeña corrección a pesar de que, como resultado de la super en la rama else debe ser devuelto: return [super openURL:dirección url];
    • Genial! Hice la corrección sugerida. Saludos!
    • También se podría categorizar UIApplication y reemplazar el openURL aplicación. A pesar de que de esta manera es difícil (pero no imposible) para hacer referencia a la implementación original.
    • FYI – he publicado una BrowserViewController en GitHub que aplica plenamente el presente, así como el apoyo a los enlaces desde dentro de un UIWebView aquí: github.com/nbuggia/Browser-View-Controller–iPhone-.
    • Bueno Nathan!
    • Parece ser que esto solo funciona para los enlaces web, no autoformatted números de teléfono.
    • En ¿qué método puedo establecer mi solicitud del delegado?
    • hkcktk: la aplicación delegado siempre se configura cuando se inicia la aplicación. Su subclase específica es la instalación en la raíz xib o guión gráfico. Todos los de Xcode de plantillas crear un delegado para ti. Busca una clase que implementa UIApplicationDelegate.
    • textView:shouldInteractWithURL:inRange está en desuso.

  2. 50

    En iOS 7 o Posterior

    Puede utilizar el siguiente UITextView delegado Método:

    - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange

    La vista de texto llama a este método si el usuario pulsa o largo de las prensas de la URL del enlace. La aplicación de este método es opcional. De forma predeterminada, el texto se abre la vista de la aplicación responsable de manejar el tipo de dirección URL y le pasa la dirección URL. Puede utilizar este método para desencadenar una acción alternativa, tales como mostrar el contenido de la web en la URL de la web dentro de la aplicación actual.

    Importante:

    Enlaces en el texto vistas son interactivos sólo si la vista de texto es
    seleccionable pero editable. Es decir, si el valor de la UITextView
    el seleccionables propiedad es SÍ y la isEditable propiedad es NO.

    • Me alegro de que lo hayan añadido esto a la UITextViewDelegate.
    • Por desgracia, todavía te terminan usando UIWebView si usted desea hacer algún otro texto el enlace y no a la propia dirección URL. El <a> etiqueta sigue siendo el mejor camino a seguir en ese caso.
    • Esto debe ser aceptado respuesta.
    • En el caso de que otras personas vean esto, ahora se puede hacer algún otro texto del enlace.
  3. 6

    Para Swift 3

    textView.delegate = self
    
    extension MyTextView: UITextViewDelegate 
    
        func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
    
            GCITracking.sharedInstance.track(externalLink: URL)
            return true
        }
    }

    o si el objetivo es >= IOS 10

    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool
  4. 5

    Swift versión:

    Su estándar UITextView el programa de instalación debería ser algo como esto, no olvides que el delegado y dataDetectorTypes.

    var textView = UITextView(x: 10, y: 10, width: CardWidth - 20, height: placeholderHeight) //This is my custom initializer
    textView.text = "dsfadsaf www.google.com"
    textView.selectable = true
    textView.dataDetectorTypes = UIDataDetectorTypes.Link
    textView.delegate = self
    addSubview(textView)

    Después de la clase termina agregar esta pieza:

    class myVC: UIViewController {
        //viewdidload and other stuff here
    }
    
    extension MainCard: UITextViewDelegate {
        func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
            //Do your stuff over here
            var webViewController = SVModalWebViewController(URL: URL)
            view.presentViewController(webViewController, animated: true, completion: nil)
            return false
        }
    }
  5. 2

    Con Swift 3 y i0S 10, la forma más sencilla de interactuar con los números de teléfono, direcciones url o direcciones de UITextView es el uso de UIDataDetectorTypes. El código siguiente muestra cómo mostrar un número de teléfono en un UITextView para que el usuario pueda interactuar con él.

    import UIKit
    
    class ViewController: UIViewController {
    
        //Link this outlet to a UITextView in your Storyboard
        @IBOutlet weak var textView: UITextView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            textView.text = "+33687654321"
            textView.isUserInteractionEnabled = true //default: true
            textView.isEditable = false //default: true
            textView.isSelectable = true //default: true
            textView.dataDetectorTypes = [.phoneNumber]
        }
    
    }

    Con este código, cuando se hace clic en el número de teléfono, un UIAlertController emergente.


    Como alternativa, puede utilizar NSAttributedString:

    import UIKit
    
    class ViewController: UIViewController {
    
        //Link this outlet to a UITextView in your Storyboard
        @IBOutlet weak var textView: UITextView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let phoneUrl = NSURL(string: "tel:+33687654321")! //"telprompt://+33687654321" also works
            let attributes = [NSLinkAttributeName: phoneUrl]
            let attributedString = NSAttributedString(string: "phone number", attributes: attributes)
    
            textView.attributedText = attributedString
            textView.isUserInteractionEnabled = true //default: true
            textView.isEditable = false //default: true
            textView.isSelectable = true //default: true
        }
    
    }

    Con este código, cuando se hace clic en el atribuida cadena, un UIAlertController emergente.


    Sin embargo, puede que desee realizar alguna acción personalizada en lugar de hacer un UIAlertController ventana emergente cuando se haga clic en un número de teléfono. O es posible que desee mantener un UIAlertController emergente y realizar su propia acción personalizada en el mismo tiempo.

    En ambos casos, usted tendrá que hacer su UIViewController se ajustan a UITextViewDelegate protocolo y aplicar textView(_:shouldInteractWith:en:interacción:). El código siguiente muestra cómo hacerlo.

    import UIKit
    
    class ViewController: UIViewController, UITextViewDelegate {
    
        //Link this outlet to a UITextView in your Storyboard
        @IBOutlet weak var textView: UITextView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            textView.delegate = self
    
            textView.text = "+33687654321"
            textView.isUserInteractionEnabled = true
            textView.isEditable = false
            textView.isSelectable = true
            textView.dataDetectorTypes = [.phoneNumber]
        }
    
        func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
            /* perform your own custom actions here */
            print(URL)
    
            return false //return true if you still want UIAlertController to pop up
        }
    
    }

    Con este código, cuando se hace clic en el número de teléfono, no UIAlertController se abrirá y usted en lugar de obtener los siguientes imprimir en la consola:

    tel:+33687654321

  6. 0

    Yo no lo he probado pero se puede tratar de implementar application:handleOpenURL: método en su aplicación a los delegados que parece que todo openURL solicitud de pase a través de esta devolución de llamada.

  7. 0

    No está seguro de cómo iba a interceptar el detectados de enlace de datos, o qué tipo de función que usted necesita para ejecutar. Pero usted puede ser capaz de utilizar el didBeginEditing TextField método para ejecutar una prueba/exploración a través de la textfield si usted sabe lo que tu buscas..tales como la comparación de cadenas de texto que cumplen con los ###-###-#### formato, o comenzar con «www.» para agarrar esos campos, pero usted tendrá que escribir un poco de código a oler a través de los campos de texto de la cadena, reconize lo que usted necesita y, a continuación, extraer para su función de uso. No creo que esto sería muy difícil, una vez que se estrecha hacia abajo exactamente qué es lo que te quería y, a continuación, centró su si() declaración de los filtros de abajo a muy específico patrón de coincidencia de lo que usted necesita.

    De couse esto implica que el usuario toque el cuadro de texto con el fin de activar la didBeginEditing(). Si ese no es el tipo de interacción con el usuario que estabas buscando sólo podría utilizar un Temporizador de activación, que se inicia en ViewDidAppear() u otras basadas en la necesidad y se ejecuta a través de los campos de texto de la cadena, luego, al final de ejecutar a través de la textfield cadena métodos que se construyó, usted sólo tiene que girar el Temporizador de la espalda.

  8. 0

    application:handleOpenURL: se llama cuando otra aplicación se abre su de la aplicación mediante la apertura de una URL con un esquema admite la aplicación. No se le llama cuando la aplicación empieza la apertura de una URL.

    Creo que la única manera de hacer lo Vladimir quiere es utilizar un UIWebView en lugar de un UITextView. Hacer que su controlador de vista de implementar UIWebViewDelegate, establecer el UIWebView del delegado a la vista controlador, y en el controlador de vista de implementar webView:shouldStartLoadWithRequest:navigationType: para abrir [request URL] en una vista en lugar de salir de la aplicación y abrirla en Mobile Safari.

  9. 0

    Swift 4:

    1) Crear la siguiente clase (subclase UITextView):

    import Foundation
    
    protocol QuickDetectLinkTextViewDelegate: class {
        func tappedLink()
    }
    
    class QuickDetectLinkTextView: UITextView {
    
        var linkDetectDelegate: QuickDetectLinkTextViewDelegate?
    
        override init(frame: CGRect, textContainer: NSTextContainer?) {
            super.init(frame: frame, textContainer: textContainer)
    
        }
    
        required init?(coder aDecoder: NSCoder) {
             super.init(coder: aDecoder)
        }
    
        override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
            let glyphIndex: Int? = layoutManager.glyphIndex(for: point, in: textContainer, fractionOfDistanceThroughGlyph: nil)
            let index: Int? = layoutManager.characterIndexForGlyph(at: glyphIndex ?? 0)
            if let characterIndex = index {
                if characterIndex < textStorage.length {
                    if textStorage.attribute(NSLinkAttributeName, at: characterIndex, effectiveRange: nil) != nil {
                        linkDetectDelegate?.tappedLink()
                        return self
                    }
                }
            }
    
            return nil
        }
    }


    2) cuando usted configurar su textview, hacer esto:

    //init, viewDidLoad, etc
    textView.linkDetectDelegate = self
    
    //outlet
    @IBOutlet weak var textView: QuickDetectLinkTextView!
    
    //change ClassName to your class
    extension ClassName: QuickDetectLinkTextViewDelegate {
        func tappedLink() {
            print("Tapped link, do something")
        }
    }


    Si usted está utilizando el guión gráfico, asegúrese de que su textview se ve como esta en el panel derecho de la identidad del inspector:

    Cómo interceptar haga clic en el enlace en UITextView?

    Voila! Ahora tienes el enlace pulse inmediatamente en lugar de cuando la dirección URL shouldInteractWith método de URL

    • también: si desea que la url no se puede controlar, sólo tienes que configurar el shouldInteractWith método para devolver false
    • Creo que esto tiene un montón de problemas, como lo que sucede cuando usted no presiona un enlace. Es decir no creo que la vista de texto funcionará con normalidad, ya se devuelve nil. La selección va a cambiar cuando se pulsa en un enlace, porque en ese caso, el auto se devuelve.
    • funciona muy bien para mí, usted necesita para manejar estos casos para sus necesidades
    • bajo var linkDetectDelegate: QuickDetectLinkTextViewDelegate?
    • No funciona correctamente – hitTest se llama dos veces
    • no para mí, debe de estar haciendo algo mal

Dejar respuesta

Please enter your comment!
Please enter your name here