3

我有一个 UITextView 可以有多行。我感兴趣的是光标在某一行上的位置(第一行、第二行、第三行等都没有关系)。

我一直在记录 UITextRange.start 这正是我所需要的,即 offset 属性:

cp <UITextPositionImpl: 0x6e93260> <<WebVisiblePosition: 0x6e92d00>(offset=5, context=([d|], [u+0064|u+0000])>

我的问题是我如何将 offset=5 变成一个简单的整数?

这是我的代码:

UITextRange *caretPositionRange = textView.selectedTextRange;
NSLog(@"cp %@", caretPositionRange.start);

我只需要像 int cp = caretPositionRange.start.offset 这样不起作用的东西。


编辑:

澄清一下,我对每一行的光标位置特别感兴趣,而不是整个 TextView。所以这真的行不通:

UITextRange *caretPositionRange = tv.selectedTextRange;
    int caretPosition = [tv offsetFromPosition:tv.beginningOfDocument
                            toPosition:caretPositionRange.start];

因为这会给我每条线的不同位置。


编辑2:

杰西给出的以下答案非常有效。第一次,我得到了一个 EXC_BAD_EXCESS,因为我没有检查 startOfLine = nil,所以请记住检查它是否不是 nil。

4

1 回答 1

3

您需要通过 UITextInput 方法询问 UITextView。像这样的东西:

UITextPosition *pos = caretPositionRange.start;
id<UITextInputTokenizer> tokenizer = [textView tokenizer];
UITextPosition *startOfLine = [tokenizer positionFromPosition:pos 
                                                   toBoundary:UITextGranularityLine
                                                 inDirection:UITextStorageDirectionBackward];
if (startOfLine != nil) {
    // based on some experiments, startOfLine may be nil for, eg, empty text views
    // the next line crashes if you pass nil, so we check first
    NSUInteger offset = [textView offsetFromPosition:startOfLine
                                          toPosition:pos];
}
于 2012-06-10T19:17:52.030 回答