Dies ist eine zusätzliche Frage zu a previous answer of mine zu der Frage Detecting taps on attributed text in a UITextView in iOS.Erkennen von Abgriffen auf attributierten Text in einem UITextView, während die Tastatur
Ich habe den folgenden Code mit Xcode 7.1.1 und iOS 9.1 erneut getestet und es funktioniert gut mit dem Setup in der Antwort beschrieben, die ich verknüpfte.
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)")
}
}
}
}
Wenn jedoch die UITextView
Einstellungen geändert werden, so dass es sowohl editierbare und wählbar ist
dann wird dies die Tastatur verursachen angezeigt werden soll. Nachdem die Tastatur angezeigt wird, wird der Abgriffsereignishandler nicht mehr aufgerufen. Was kann getan werden, um auf zugeordneten Text zu tippen, während die Tastatur angezeigt wird?
aktualisiert
Obwohl der Code hier in Swift ist, die Person, die ursprünglich diese Frage gestellt (in einem Kommentar zu der Antwort, die ich oben verlinkt) war mit Objective-C arbeiten. Ich würde also gerne eine Antwort in Swift oder Objective-C akzeptieren.
Ich möchte die Zeichenfolge abrufen, die mit Ziel c angezapft wurde, wissen Sie, wie man diesen Code schreibt? – Eleanor
@Liu - Haben Sie bereits die Frage [Erkennen von Taps auf attributiertem Text in einem UITextView in iOS] (http://stackoverflow.com/questions/19332283/detecting-taps-on- attributed-text-in-a-uitextview) -in-ios)? Es gibt mehrere Antworten in Objective-C. – Suragch
Ja, aber ich möchte den bestimmten Text nur einmal tippen, mit anderen Worten, wenn ich auf ein Wort tippe, möchte ich das Attribut aus diesem Wort entfernen, so dass ich es nicht zweimal tippen konnte, wusste ich nicht wie Hattest du eine Idee? – Eleanor