3

複数の行を持つことができるUITextViewがあります。私が興味を持っているのは、特定の行(1行目、2行目、3行目などは関係ありません)上のカーソルの位置です。

私は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:

ジェシーによって与えられた以下の答えは本当にうまくいきます。startOfLine = nilかどうかをチェックしなかったため、初めてEXC_BAD_EXCESSを取得したので、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 に答える