Objective-C
Cocoa

NSTextView にドラッグ&ドロップしたときのキャレットの位置を取得する

More than 3 years have passed since last update.

NSTextView のキャレットの位置は通常 [aTextView selectedRange].location で取得できる。キャレットの位置は幅0の選択範囲と同義だからである。

しかし、 テキストを選択した状態で NSTextView の上で何かをドラッグしたとき表示されるキャレットの位置はこの方法では取得できない。この場合、 NSDraggingInfo からマウスカーソルの位置を取得し、キャレットの位置に変換すればよい:

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender {
    NSPoint dropPoint = [self convertPoint:[sender draggingLocation] fromView:nil];
    NSUInteger caretLocation = [self characterIndexForInsertionAtPoint:dropPoint];
}

参考:nstextview - Set the cursor to a pointing hand over a text view - Stack Overflow