2015-11-12 17 views
7
zeigt

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

enter image description here

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.

+0

Ich möchte die Zeichenfolge abrufen, die mit Ziel c angezapft wurde, wissen Sie, wie man diesen Code schreibt? – Eleanor

+0

@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

+0

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

Antwort

0

In Ihrem UITextView des Controllers können Sie UITextViewDelegate implementieren, dann überschreiben Methode

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

Innerhalb dieser Methode können Sie die selectedRange des Textview zugreifen können, die auch die „Abzweiger“ Ihrer zurückzuführen Text sein sollte. Geben Sie dann wahr/falsch zurück, je nach Ihren Bedürfnissen.