Objective c NSTextView选择特定行

Objective c NSTextView选择特定行,objective-c,macos,nstextview,Objective C,Macos,Nstextview,我使用的是Xcode 10,Objective-C,macOS而不是iOS 如果给出了行号,是否可以通过编程方式在NSTextView中选择一行?不是通过更改内容的任何属性,而是像用户通过三次单击所做的那样选择内容 我知道如何按范围获取所选文本,但这次我需要以编程方式选择文本 我找到了selectLine:(id),但它似乎是一个插入点。 一个指向正确方向的指针将是非常好的,非常感谢。这里的苹果文档对于您尝试做的事情应该很有用 在计算包装文本行数的示例中,他们使用NSLayoutManager方

我使用的是Xcode 10,Objective-C,macOS而不是iOS

如果给出了行号,是否可以通过编程方式在
NSTextView
中选择一行?不是通过更改内容的任何属性,而是像用户通过三次单击所做的那样选择内容

我知道如何按范围获取所选文本,但这次我需要以编程方式选择文本

我找到了
selectLine:(id)
,但它似乎是一个插入点。
一个指向正确方向的指针将是非常好的,非常感谢。

这里的苹果文档对于您尝试做的事情应该很有用

在计算包装文本行数的示例中,他们使用NSLayoutManager方法
lineFragmentRectfolyphatindex:effectiveRange
查找行的有效范围,然后将计数索引增加到该范围的末尾(即从下一行开始)。只需稍作修改,就可以使用它来查找要选择的行的范围,然后使用NSTextView的
setSelectedRange:
来选择它

以下是我认为它可能会对您试图实现的目标起作用的地方:

- (void)selectLineNumber:(NSUInteger)lineNumberToSelect {
    NSLayoutManager *layoutManager = [self.testTextView layoutManager];
    NSUInteger numberOfLines = 0;
    NSUInteger numberOfGlyphs = [layoutManager numberOfGlyphs];
    NSRange lineRange;
    for (NSUInteger indexOfGlyph = 0; indexOfGlyph < numberOfGlyphs; numberOfLines++) {
        [layoutManager lineFragmentRectForGlyphAtIndex:indexOfGlyph effectiveRange:&lineRange];
        // check if we've found our line number
        if (numberOfLines == lineNumberToSelect) {
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                [self.testTextView setSelectedRange:lineRange];
            }];
            break;
        }
        indexOfGlyph = NSMaxRange(lineRange);
    }
}
请记住,我们从索引0开始。如果传入一个大于numberOfLines的lineNumberToSelect,它应该只是一个no op,并且选择应该保持在原来的位置

[self selectLineNumber:3];