1

NSTextField に何かをドロップすることを禁止したいです。私のアプリでは、ユーザーは iCal イベントを GUI の別の部分にドラッグ アンド ドロップできます。テスト ユーザーが誤って iCal イベントをテキスト フィールドにドロップしてしまいましたが、彼はこれに気付きませんでした。テキストが 1 行のテキスト フィールドに表示されている行よりも上の行に挿入されているためです。

(テキスト フィールドをクリックし、キーボードを使用して 1 行上に移動すると、挿入されたテキストを表示できます。 !)

私は試しましたregisterForDraggedTypes:[NSArray array]](効果がないようです)だけでなく、draggingEntered:返されるデリゲートメソッドを実装しましたNSDragOperationNone(デリゲートメソッドは呼び出されません)。

何か案は?

編集:もちろん、何かを NSTextField にドロップすると、フォーカスがある場合にのみ機能します。これは、sspのブログDaniel Jalkut のブログ エントリへのコメントで説明されています。

4

4 に答える 4

4

私のブログ投稿のコメントを見つけていただければ幸いです。それらは、あなたが探しているものを達成する方法を発見するための氷山の一角だと思います.

NSTextFieldフォーカスがある場合にへのドラッグが機能する理由は、「フィールド エディタ」と呼ばれる、NSTextFieldよりリッチで強力なビュー ( ) によって が一時的に隠されているためです。NSTextView

フィールド エディタに関する Apple のドキュメントの次のセクションを確認してください。

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/TextEditing/Tasks/FieldEditor.html

あなたが目指していることを達成するにはNSTextField、ウィンドウ デリゲート メソッドを実装することによって、フィールド エディターの標準的な提供をインターセプトする必要があると思います。

windowWillReturnFieldEditor:toObject:

これにより、 の設定を微調整するかNSTextView、まったく新しいフィールド エディタ オブジェクトを提供することができます。

最悪のシナリオでは、NSTextViewすべてのドラッグを拒否するように設計された独自のサブクラスをフィールド エディターとして提供できます。

于 2009-08-11T12:40:49.867 に答える
3

これはうまくいくかもしれません: NSTextView をサブクラス化-acceptableDragTypesし、 returnnilに実装すると、テキスト ビューはドラッグ先として無効になります。また、NSDraggingDestination メソッドを実装し、NSDragOperationNone-draggingEntered:-draggingUpdated:返す必要がありました。

@implementation NoDragTextView
- (NSArray *)acceptableDragTypes
{
    return nil;
}
- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender
{
    return NSDragOperationNone;
}
- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender
{
    return NSDragOperationNone;
}
@end
于 2012-07-25T03:54:11.230 に答える
2

カスタム NSTextView を作成し、NSTextView を非表示に設定するために NSDraggingDestination プロトコル メソッドの開始と終了を実装することで、この問題を解決することができました。テキスト フィールドが非表示になると、スーパービューはドラッグ アンド ドロップ イベントをキャッチできるようになります。または、スーパービューがドラッグ アンド ドロップを実装していない場合、またはドラッグ アンド ドロップが必要な場合は破棄されます。

例えば:

- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender {

    //hide so that the drop event falls through into superview's drag/drop view
    [self setHidden:YES];

    return NSDragOperationNone;
}

- (void)draggingExited:(id<NSDraggingInfo>)sender {

    //show our field editor again since dragging is all over with
    [self setHidden:NO];

}
于 2011-12-10T02:51:05.230 に答える
-1

やってみました

- (void)DraggedTypes の登録を解除
NSViewから?

于 2009-02-26T20:07:11.820 に答える