Saltar al contenido

Evento de clic NSAttributedString en UILabel usando swift

Encontramos la contestación a esta pregunta, al menos eso pensamos. Si presentas interrogantes puedes dejarlo en el apartado de comentarios, que sin tardar

Solución:

No es necesario utilizar un reconocedor de gestos por separado, ya que algunas de las respuestas indican. En su lugar, puede utilizar texto atribuido en combinación con el UITextViewDelegate‘s textView:shouldInteractWithURL:inRange:interaction: método para lograr esto, por ejemplo:

class ViewController: UIViewController, UITextViewDelegate 

    @IBOutlet weak var textView: UITextView!

    override func viewDidLoad() 
        super.viewDidLoad()

        let text = NSMutableAttributedString(string: "Already have an account? ")
        text.addAttribute(NSAttributedString.Key.font, value: UIFont.systemFont(ofSize: 12), range: NSMakeRange(0, text.length))

        let selectablePart = NSMutableAttributedString(string: "Sign in!")
        selectablePart.addAttribute(NSAttributedString.Key.font, value: UIFont.systemFont(ofSize: 12), range: NSMakeRange(0, selectablePart.length))
        // Add an underline to indicate this portion of text is selectable (optional)
        selectablePart.addAttribute(NSAttributedString.Key.underlineStyle, value: 1, range: NSMakeRange(0,selectablePart.length))
        selectablePart.addAttribute(NSAttributedString.Key.underlineColor, value: UIColor.black, range: NSMakeRange(0, selectablePart.length))
        // Add an NSLinkAttributeName with a value of an url or anything else
        selectablePart.addAttribute(NSAttributedString.Key.link, value: "signin", range: NSMakeRange(0,selectablePart.length))

        // Combine the non-selectable string with the selectable string
        text.append(selectablePart)

        // Center the text (optional)
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.alignment = NSTextAlignment.center
        text.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSMakeRange(0, text.length))

        // To set the link text color (optional)
        textView.linkTextAttributes = [NSAttributedString.Key.foregroundColor:UIColor.black, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 12)]
        // Set the text view to contain the attributed text
        textView.attributedText = text
        // Disable editing, but enable selectable so that the link can be selected
        textView.isEditable = false
        textView.isSelectable = true
        // Set the delegate in order to use textView(_:shouldInteractWithURL:inRange)
        textView.delegate = self
    

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

        // **Perform sign in action here**

        return false
    

En lugar de la etiqueta, puede usar la vista de texto para abrir el controlador de vista o hacer que se pueda hacer clic en la subcadena

  1. crear attribute por string que quieres que se pueda hacer clic

    let linkAttributes = [
        NSLinkAttributeName: NSURL(string: "https://www.apple.com")!,
        NSForegroundColorAttributeName: UIColor.blue
        ] as [String : Any]
    
  2. Haz tu string atribuido string

    let attributedString = NSMutableAttributedString(string:"My name is Jarvis")
    attributedString.setAttributes(linkAttributes, range: NSMakeRange(5, 10))
    

    puede dar su rango personalizado aquí.

  3. Agregue texto atribuido a su vista de texto

    YourTextView.attributedText = attributedString 
    
  4. Luego, implemente el siguiente método delegado de vista de texto para implementar la interacción para la URL

    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool 
    // here write your code of navigation 
    return false 
    
    
  5. Si desea hacerlo con etiqueta, haga clic aquí (Cómo hacer un enlace en el que se puede hacer clic en una NSAttributedString para a)

Actualización de idioma basada en la respuesta de @Lindsey Scott 🙂

Rápido 4

class ViewController: UIViewController, UITextViewDelegate 
   
    @IBOutlet weak var textView: UITextView!

    override func viewDidLoad() 
        super.viewDidLoad()
        
        let text = NSMutableAttributedString(string: "Already have an account? ")
        text.addAttribute(NSAttributedStringKey.font,
                          value: UIFont.systemFont(ofSize: 12),
                          range: NSRange(location: 0, length: text.length))
        
        let interactableText = NSMutableAttributedString(string: "Sign in!")
        interactableText.addAttribute(NSAttributedStringKey.font,
                                      value: UIFont.systemFont(ofSize: 12),
                                      range: NSRange(location: 0, length: interactableText.length))
        
        // Adding the link interaction to the interactable text
        interactableText.addAttribute(NSAttributedStringKey.link,
                                      value: "SignInPseudoLink",
                                      range: NSRange(location: 0, length: interactableText.length))
        
        // Adding it all together
        text.append(interactableText)
        
        // Set the text view to contain the attributed text
        textView.attributedText = text
        
        // Disable editing, but enable selectable so that the link can be selected
        textView.isEditable = false
        textView.isSelectable = true
        textView.delegate = self
    
    
    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool 
        
        //Code to the respective action
        
        return false
    

Te invitamos a sustentar nuestra tarea escribiendo un comentario y valorándolo te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *