2013-07-09 17 views
5

Gibt es einen Weg (verrückte Hacks willkommen) die aktuelle Zeile als String eines UITextView zu bekommen? Dies würde den Zeilenumbruch enthält, etc. Zum Beispiel, in diesem Fall:UITextView bekomme die aktuelle Zeile

enter image description here

Verfahren zurückkehren würde „? Stack-Überlauf Ist es nicht toll, ich“, denn das ist die aktuelle Zeile auf dem Cursor basierte .

Es könnte auch zurückgeben "Dies ist ein Test, für den ich gemacht habe" oder "denke ja", basierend auf der Position des Cursors. Ich habe versucht, mit den UITextView-Methoden und denen des UITextInput-Protokolls zu arbeiten.

EDIT:

Hier ist der Code habe ich versucht, zu verwenden. Der Grund, warum ich die Zeichenfolge finden muss, ist ihre Länge. Aus diesem Grund wird der UI-basierte Code angezeigt.

NSRange location = self.textView.selectedRange; 
NSString *searchString = [self.textView.text substringWithRange:NSMakeRange(0, location)]; 
CGSize currentStringDimensions = [searchString sizeWithFont:self.textView.font constrainedToSize:CGSizeMake(self.textView.frame.size.width, self.textView.frame.size.height) lineBreakMode:NSLineBreakByWordWrapping];  
float numberOfRows = (currentStringDimensions.width/(self.textView.frame.size.width)); 
float left = (float)(numberOfRows - (int)numberOfRows) * (self.textView.frame.size.width); 

Dies funktioniert jedoch nicht. Ich denke, es könnte etwas mit umbrochenen Wörtern oder den unterschiedlich großen Zeichen haben, aber der linke Wert ist inkonsistent oder nach der ersten Zeile aus.

+0

Zeigen Sie den Code, den Sie versucht haben und was es tatsächlich zurückgegeben, wie nah haben Sie bekam (ich würde sagen, 'UITextInput' das ist richtiger Ansatz). – Wain

+0

Aktualisiert Hauptfrage damit – roozbubu

+1

Sehen Sie dies - http://stackoverflow.com/questions/4421267/how-to-get-text-from-nth-line-of-uilabel/14413484#14413484 – TheTiger

Antwort

0

Ich endete mit der Methode caretRect von UITextInput, um den Offset von der linken Seite zu erhalten. Einwandfrei gearbeitet.

+1

Können Sie Arbeitscode posten für andere zu sehen? – jonathanpeppers

+0

@jonathanpeppers Leider kann ich nicht. Dies war für ein bezahltes Praktikum, das ich im letzten Sommer gemacht habe, daher ist der Code nicht zugänglich. – roozbubu

+1

Kannst du das Beispiel selbstständig umsetzen und posten? Anscheinend ist dies der Punkt von StackOverflow. Es sollte nicht die akzeptierte Antwort sein, es sei denn, es enthält die Antwort. – jonathanpeppers

2

Die folgende Codelösung scheint zu funktionieren. Das "Selbst" in diesem Code bezieht sich auf eine Instanz von UITextView.

- (NSString *) getLineString:(NSRange)range 
{ 
    NSLayoutManager *manager = self.layoutManager; 

    // Convert it to a glyph range 
    NSRange matchingGlyphRange = [manager glyphRangeForCharacterRange:range actualCharacterRange:NULL]; 

    // line fragment rect at location range 
    CGRect rect = [manager lineFragmentRectForGlyphAtIndex:matchingGlyphRange.location effectiveRange:nil]; 

    // obtain the line range for the line fragment rect 
    NSRange lineRange = [manager glyphRangeForBoundingRect:rect inTextContainer:self.textContainer]; 

    // extract the string out from lineRange 
    return [self.text substringWithRange:lineRange]; 
} 

// ... later 
NSLog(@"line %@", [self getLineString:self.selectedRange]); 
0

Das funktionierte für mich (self = die UITextView)

func getLineString() -> String { 
    return (self.text! as NSString).substringWithRange((self.text! as NSString).lineRangeForRange(self.selectedRange)) 
} 
Verwandte Themen