2009-02-26 2 views
1

私は自分のNSTextFieldに何かをドロップすることを許可しません。私のアプリでは、ユーザーはiCalイベントをGUIの別の部分にドラッグアンドドロップできます。今では、誤ってiCalイベントをテキストフィールドにドロップしたテストユーザーがいますが、テキストが1行のテキストフィールドに表示されている行の上に挿入されているため、これを認識しませんでした。NSTextFieldのドラッグアンドドロップを無効にするにはどうすればよいですか?

(テキストフィールドをクリックしてキーボードを1行上に移動すると、挿入されたテキストが表示されますが、何かが挿入されたことに気づいていないため、通常のユーザーはこれを行いません最初の場所で!)

私はどんな効果を持っているように見える)などNSDragOperationNoneを返すdraggingEntered:デリゲートメソッドを実装していません(registerForDraggedTypes:[NSArray array]]を試してみました(デリゲートメソッドでも)呼び出されません。

アイデア?

EDIT:それはフォーカスがあるときhis blogにし、comments to a blog entry by Daniel JalkutにSSPによって記載されているようにNSTextField上に何かを落としもちろんにのみ、動作します。

答えて

3

:テキストフィールドが非表示されたら、スーパー、ドラッグ/ドロップイベントをキャッチする、またはスーパービューが実装またはドラッグ/彼らは例えば

を破棄しているドロップしたくない場合はことができるようになりますこれは動作する可能性があります:NSTextViewをサブクラス化してを実装してnilを返すと、テキストビューはドラッグ先として無効になります。 NSDragOperationNoneを返すには、NSDraggingDestinationメソッド-draggingEntered:-draggingUpdated:を実装する必要もありました。

@implementation NoDragTextView 
- (NSArray *)acceptableDragTypes 
{ 
    return nil; 
} 
- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender 
{ 
    return NSDragOperationNone; 
} 
- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender 
{ 
    return NSDragOperationNone; 
} 
@end 
+0

これを試したことはありませんが、有望なアプローチのように思えます。 –

-1

NSViewの

- (void)unregisterDraggedTypes
を試しましたか?

+0

私は最終的にこれを試してみることにしました(私はこの文書が仕事をしなければならないかのように文書には同意します)。 私のコントローラのawakeFromNibでは、NSTextFieldアウトレットのunregisterDraggedTypesを呼び出します。しかし、これは何の効果もないようです...私はまだ私のフィールドにものをドラッグすることができます。 –

+0

unregisterDraggedTypesが呼び出されたときにデバッガでコンセントが接続されていてNULLでないことを確認しましたか? – Mark

+0

これは動作しません。 – Padraig

3

私のブログ記事のコメントを発見してうれしいです。私は彼らがあなたが探しているものを達成する方法を発見するために氷山の先端であると思う。

NSTextFieldにドラッグする理由は、フォーカスがあるとNSTextField自体がより豊かでより強力なビュー(NSTextView)によって一時的に隠されていたことに留意する必要があります。これはNSTextField編集者。"

フィールドエディタ上のAppleのドキュメントのこのセクションをご覧ください:

http://developer.apple.com/documentation/Cocoa/Conceptual/TextEditing/Tasks/FieldEditor.html

あなたがのために努力しているものを達成するために、私はあなたのためのフィールドエディタの標準提供を傍受する必要があるかもしれないと思いますNSTextFields、ウィンドウのデリゲートメソッドを実装することによって:

windowWillReturnFieldEditor:toObject:

これは、あなたの目の上の設定を微調整するためにどちらかの機会を与えますe NSTextView、まったく新しいフィールドエディタオブジェクトを提供します。

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

2

カスタムNSTextViewを作成し、入力と終了のNSDraggingDestinationプロトコルメソッドを実装して、NSTextViewを非表示に設定することで、この問題を解決できました。

- (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]; 

} 
関連する問題