2016-06-20 36 views
2

Ich habe eine UITextView, wo ich einen Teil des Textes auswählen möchte. Ich versuche selectedTextRange zu verwenden, leider habe ich diesen Fehler:Wie wähle ich einen Text in einem TextView mit einem NSRange in Swift aus?

Cannot convert value of type 'NSRange' (aka '_NSRange') to expected argument type 'UITextRange'

Dies ist der Code, den ich zu verwenden bin versucht:

mainTextField.becomeFirstResponder() 
mainTextField.selectedTextRange = mainTextField.textInRange(matchRange) // matchRange is a NSRange 

Der Bereich verwende ich aus einem Regex kommenden die ich von this tutorial1 angepasst:

EDIT: hinzugefügt, um die erste Zeile

if let regex = NSRegularExpression(options: searchOptions){ // refers to an installed extension convenience init 
let range = NSMakeRange(0, (mainTextField.text.characters.count)) 
let matches = regex.matchesInString(mainTextField.text, options: [], range: range) 
[...] 
+0

Bitte geben Sie die Deklaration Ihrer 'regex' Variable teilen zu –

+0

Danke Victor Sigler, ich hinzugefügt. – Cue

Antwort

4

Sie können eine Erweiterung unter UITextView hinzufügen, die die Konvertierung durchführt.

extension UITextView 
    { 
     func textRangeFromNSRange(range:NSRange) -> UITextRange? 
     { 
      let beginning = self.beginningOfDocument 
      guard let start = self.positionFromPosition(beginning, offset: range.location), end = self.positionFromPosition(start, offset: range.length) else { return nil} 

      return self.textRangeFromPosition(start, toPosition: end) 
     } 
    } 

Verwenden

if let range = mainTextView.textRangeFromNSRange(range: matchRange){ 
     mainTextField.selectedTextRange = range 
    } 

Wo matchRange ist ein NSRange und range ist ein UITextRange

0

Nur ein wenig mehr Informationen hinzuzufügen, fand ich auch einen alternativen Weg: Statt selectedTextRange der Verwendung und tun die Umwandlung können Sie selectedRange verwenden.

Hinweis: matchRange ist ein NSRange

// this don't work because selectedTextRange requires an UITextRange 
textField.selectedTextRange = textField.textInRange(matchRange) // don't work 

// this works because selectedRange requires a NSRange 
textField.selectedRange = matchRange // works