2009-02-26 5 views
1

Ich möchte nichts in mein NSTextField fallen lassen. In meiner App können Benutzer iCal-Ereignisse in einen anderen Teil der GUI ziehen und dort ablegen. Jetzt hatte ich einen Testbenutzer, der versehentlich das iCal-Ereignis in das Textfeld fallen ließ - aber das merkte er nicht, weil der Text in die Zeilen oberhalb der Zeile eingefügt wurde, die ich in meinem einzeiligen Textfeld sehe.Wie deaktiviert man Drag-n-Drop für NSTextField?

(Sie können den eingefügten Text anzeigen, indem Sie in das Textfeld klicken und mit der Tastatur eine Zeile gehen - aber ein normaler Benutzer würde dies nicht tun, weil er nicht einmal bemerkt hätte, dass etwas eingefügt wurde an erster Stelle!)

habe ich versucht, registerForDraggedTypes:[NSArray array]] (scheint keine Wirkung zu haben) sowie die Umsetzung der draggingEntered: Delegatmethode Rückkehr NSDragOperationNone (die delegierte Methode wird aufgerufen, nicht einmal).

Irgendwelche Ideen?

EDIT: Natürlich etwas auf eine NSTextField fallen funktioniert nur, wenn es Fokus hat, wie ssp in his blog und in der comments to a blog entry by Daniel Jalkut beschrieben.

Antwort

3

Das könnte funktionieren: Wenn Sie NSTextView von der Unterklasse ableiten und -acceptableDragTypes implementieren, um nil zurückzugeben, wird die Textansicht als Ziehziel deaktiviert. Ich musste auch die NSDraggingDestination-Methoden -draggingEntered: und -draggingUpdated: implementieren, um NSDragOperationNone zurückzugeben.

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

Habe das nicht versucht, klingt aber nach einem vielversprechenden Ansatz. –

-1

Haben Sie versucht,

- (void)unregisterDraggedTypes
von NSView?

+0

Ich bin endlich gekommen, um dies zu versuchen (ich stimme zu, dass die Dokumentation klingt, als ob dies die Arbeit tun sollte). Also in meinem wakeFromNib Controller ich rufe unregisterDraggedTypes auf meinem NSTextField outlet. Das scheint aber keine Wirkung zu haben ... Ich kann immer noch Sachen in mein Feld ziehen. –

+0

Haben Sie Ihre Steckdose im Debugger überprüft, um sicherzustellen, dass sie verbunden ist, und nicht NULL, wenn unregisterDraggedTypes aufgerufen wird? – Mark

+0

Dies funktioniert nicht. – Padraig

3

Ich bin froh, dass Sie die Kommentare in meinem Blogpost entdeckt haben. Ich denke, sie sind die Spitze des Eisbergs, um zu entdecken, wie man das erreicht, wonach man sucht.

Sie müssen bedenken, dass der Grund, der zu einem NSTextField zieht, wenn es den Fokus hat, ist, dass das NSTextField selbst vorübergehend von einer reicheren, leistungsfähigeren Ansicht (einem NSTextView) verdeckt wurde Editor."

Überprüfen dieser Abschnitt von Apples Dokumentation auf dem Feld Editor:

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

Um das zu erreichen, was Sie anstreben, ich glaube, Sie könnten für die Standardbestimmung des Feldes Editor abfangen benötigen NSTextFields, durch das Fenster Delegatmethode Umsetzung:

windowWillReturnFieldEditor: toObject:

Dies gibt Ihnen die Möglichkeit, die Konfiguration auf th entweder zwicken e NSTextView, oder stellen Sie ein komplett neues Feld-Editor-Objekt zur Verfügung.

Im schlimmsten Fall könnten Sie Ihre eigene NSTextView-Unterklasse als Feld-Editor bereitstellen, der entworfen wurde, um alle Verzögerungen abzulehnen.

2

Ich konnte dieses Problem lösen, indem ich ein benutzerdefiniertes NSTextView erstellte und die NSDraggingDestination-Protokollmethoden Enter und Exit implementierte, um NSTextView auf Versteckt zu setzen. Sobald das Textfeld versteckt wird die Superview wird in der Lage sein, die Drag/Drop-Ereignisse zu fangen, oder wenn der Superview nicht implementiert oder will die Drag/Drop sie

Zum Beispiel wird verworfen:

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

} 
Verwandte Themen