Objective c 如何获取UITextRange.start行起点的偏移量

Objective c 如何获取UITextRange.start行起点的偏移量,objective-c,cocoa-touch,uikit,uitextview,uitextrange,Objective C,Cocoa Touch,Uikit,Uitextview,Uitextrange,我有一个UITextView,它可以有多行。我感兴趣的是光标在某一行上的位置(第一行、第二行、第三行等都不重要) 我一直在记录uitextange.start,它正好提供了我需要的内容,即offset属性: cp <UITextPositionImpl: 0x6e93260> <<WebVisiblePosition: 0x6e92d00>(offset=5, context=([d|], [u+0064|u+0000])> 我所需要的只是int cp=ca

我有一个UITextView,它可以有多行。我感兴趣的是光标在某一行上的位置(第一行、第二行、第三行等都不重要)

我一直在记录uitextange.start,它正好提供了我需要的内容,即offset属性:

cp <UITextPositionImpl: 0x6e93260> <<WebVisiblePosition: 0x6e92d00>(offset=5, context=([d|], [u+0064|u+0000])>
我所需要的只是int cp=caretPositionRange.start.offset之类的东西,它不起作用


编辑:

为了澄清,我特别感兴趣的是每一行的光标位置,而不是整个TextView。所以这不会真正起作用:

UITextRange *caretPositionRange = tv.selectedTextRange;
    int caretPosition = [tv offsetFromPosition:tv.beginningOfDocument
                            toPosition:caretPositionRange.start];
因为这会给我每条线一个不同的位置


编辑2:


下面由Jesse给出的答案非常有效。第一次,我得到了一个EXC_BAD_超额,因为我没有检查startOfLine=nil,所以请记住检查它是否为nil。

您需要通过UITextView的UITEmpput方法询问它。大概是这样的:

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];
}
UITextPosition*pos=caretPositionRange.start;
id标记器=[textView标记器];
UITextPosition*StartOffline=[tokenizer positionFromPosition:pos
toBoundary:UITextGranularityLine
间接寻址:UITextStorageDirectionBackward];
如果(起始线!=零){
//根据一些实验,例如,空文本视图的startOfLine可能为零
//如果通过nil,下一行将崩溃,因此我们首先检查
NSU整数偏移=[textView offsetFromPosition:StartOffline
位置:pos];
}

这行不通,因为我对文档开头的职位不感兴趣,而是对行的开头感兴趣。偏移量将始终为我提供准确的值。如果我按照你的建议去做,我会得到越来越多的值,例如,如果光标位于从一行开始的第五个位置,我不会总是得到offset=5。哦,哇。对不起,我完全看错了你的问题。一秒钟。好的,现在应该可以了。根据UITextLayoutDirectionLeft应该如何处理从右到左的文本,您可能希望改用UITextLayoutDirectionLeft;我修正了一个小错误。现在试试,让我们
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];
}