如何从UITextRange.start的行开始偏移

时间:2012-06-10 19:13:23

标签: objective-c cocoa-touch uikit uitextview uitextrange

我有一个可以有多行的UITextView。我感兴趣的是光标在某一行上的位置(无论是第一行,第二行,第三行等都无关紧要。)

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

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:

Jesse给出的答案非常好。第一次,我得到了一个EXC_BAD_EXCESS,因为我没有检查startOfLine是否为nil,所以请记住检查它是否为零。

1 个答案:

答案 0 :(得分:4)

您需要通过其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];
}