Detección de toques de text atribuido en una UITextView mientras se muestra el keyboard.

Esta es una pregunta complementaria a una respuesta anterior mía a la pregunta Detección de toques de text atribuido en una UITextView en iOS .

Volví a probar el siguiente código con Xcode 7.1.1 e iOS 9.1 y funciona bien con la configuration que se describe en la respuesta a la que me he enlazado.

import UIKit class ViewController: UIViewController, UIGestureRecognizerDelegate { @IBOutlet weak var textView: UITextView! override func viewDidLoad() { super.viewDidLoad() // Create an attributed string let myString = NSMutableAttributedString(string: "Swift attributed text") // Set an attribute on part of the string let myRange = NSRange(location: 0, length: 5) // range of "Swift" let myCustomAttribute = [ "MyCustomAttributeName": "some value"] myString.addAttributes(myCustomAttribute, range: myRange) textView.attributedText = myString // Add tap gesture recognizer to Text View let tap = UITapGestureRecognizer(target: self, action: Selector("myMethodToHandleTap:")) tap.delegate = self textView.addGestureRecognizer(tap) } func myMethodToHandleTap(sender: UITapGestureRecognizer) { let myTextView = sender.view as! UITextView let layoutManager = myTextView.layoutManager // location of tap in myTextView coordinates and taking the inset into account var location = sender.locationInView(myTextView) location.x -= myTextView.textContainerInset.left; location.y -= myTextView.textContainerInset.top; // character index at tap location let characterIndex = layoutManager.characterIndexForPoint(location, inTextContainer: myTextView.textContainer, fractionOfDistanceBetweenInsertionPoints: nil) // if index is valid then do something. if characterIndex < myTextView.textStorage.length { // print the character index print("character index: \(characterIndex)") // print the character at the index let myRange = NSRange(location: characterIndex, length: 1) let substring = (myTextView.attributedText.string as NSString).substringWithRange(myRange) print("character at index: \(substring)") // check if the tap location has a certain attribute let attributeName = "MyCustomAttributeName" let attributeValue = myTextView.attributedText.attribute(attributeName, atIndex: characterIndex, effectiveRange: nil) as? String if let value = attributeValue { print("You tapped on \(attributeName) and the value is: \(value)") } } } } 

Sin embargo, si se UITextView configuration UITextView para que sea editable y seleccionable

introduzca la descripción de la imagen aquí

entonces esto hará que se muestre el keyboard. Después de que se muestra el keyboard, el manejador de events de toma ya no recibe llamadas. ¿Qué se puede hacer para detectar los toques en el text atribuido mientras se muestra el keyboard?

Actualizar

Aunque el código aquí está en Swift, la persona que originalmente hizo esta pregunta (en un comentario a la respuesta que enlazé anteriormente) estaba trabajando con Objective-C. Por lo tanto, estaría encantado de aceptar una respuesta en Swift u Objective-C.

En el controller de su UITextView, puede implementar UITextViewDelegate , luego replace el método

 -(BOOL)textViewShouldBeginEditing:(UITextView *)textView{ } 

Dentro de este método, puede acceder a selectedRange de textView, que también debería ser el "scope de toque" de su text atribuido. Luego, devuelve verdadero / falso según tus necesidades.