转到UITextView中的特定行

Joh*_*ith 3 iphone cocoa-touch uitextview

如何在出现时告诉UITextView将光标设置为特定行(例如第13行)?

Obl*_*ely 5

UITextView有一个方法setSelectedRange:(NSRange)范围.

如果你知道字符串第13行出现在哪里,比如位置237,那么执行:[textView setSelectedRange:NSMakeRange(237,0)];

如果您需要找出第13行的位置,那么您还需要做更多的工作.我首先看一下sizeWithFont,记得在你的textView宽度上咬掉大约16个点,这样iOS才能得到正确的总和.(也就是说,如果你有换行符,那么只需找到第13个(或第n个)"\n"的位置.)

在评论中进一步查询后更新

有很多方法可以找到第n个位置.以下片段并不漂亮,但它可以完成这项工作.您还可以使用rangeOfString并遍历"\n".在此片段中,如果目标行大于行数,则将光标放在末尾.这里的代码假设您有一个名为userEntry的UITextView属性.

int targetLine = 3; // change this as appropriate 0=first line

NSRange range;

NSString* exampleString = @"Hello there\nHow is it going?\nAre you looking for a new line?\nA new line in what?\nThat remains to be seen";

NSArray* separateLines = [exampleString componentsSeparatedByString:@"\n"];

if (targetLine < [separateLines count])
{
    int count = 0;
    for (int i=0; i<targetLine; i++)
    {
        count = count + [[separateLines objectAtIndex:i] length] + 1; // add 1 to compensate \n separator
    }

    range = NSMakeRange(count, 0);
}
else
{
    range = NSMakeRange([exampleString length], 0); // set to the very end if targetLine is > number of lines
}

[[self userEntry] setText: exampleString];
[[self userEntry] setSelectedRange:range];
[[self userEntry] becomeFirstResponder];
Run Code Online (Sandbox Code Playgroud)