2016-11-07 8 views
2

Ich habe NSTextField (FileDropTextField) unterklassifiziert und 2 von ihnen in einem NSView (in einem Fenster) in Main.storyboard erstellt.prepareForDragOperation() nicht aufgerufen

Wenn ich eine Datei aus dem Desktop ziehen und es auf dem ersten FileDropTextField fallen, aktualisiert sie das Feld mit dem vollständigen Pfad Text, aber prepareForDragOperation() nie aufgerufen.

Wenn ich ziehen die gleiche Datei (auf dem Desktop) und auf dem zweiten FileDropTextField fallen, werden die folgenden drei Funktionen aufgerufen werden (wie erwartet), und das Feld ist nicht automatisch mit dem Pfad aktualisiert:

  • prepareForDragOperation()
  • performDragOperation()
  • concludeDragOperation()

Der Swift-Code ist wie folgt:

import Cocoa 

class FileDropTextField: NSTextField { 

    override func draw(_ dirtyRect: NSRect) { 
     super.draw(dirtyRect) 

     // Drawing code goes here. 
    } 

    override func awakeFromNib() { 
     NSLog("awakeFromNib") 
     self.register(forDraggedTypes: [NSPasteboardTypeString, NSURLPboardType, NSFilenamesPboardType]) 
    } 

    override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation { 
     self.stringValue = "" 
     NSLog("draggingEntered") 
     return NSDragOperation.generic; 
    } 

    override func draggingUpdated(_ sender: NSDraggingInfo) -> NSDragOperation { 
     NSLog("draggingUpdated") 
     return NSDragOperation.generic; 
    } 

    override func prepareForDragOperation(_ sender: NSDraggingInfo) -> Bool { 
     NSLog("prepareForDragOperation") 
     return true 
    } 

    override func performDragOperation(_ sender: NSDraggingInfo) -> Bool { 
     NSLog("performDragOperation") 
     return true 
    } 

    override func concludeDragOperation(_ sender: NSDraggingInfo?) { 
     NSLog("concludeDragOperation") 
    } 

    override func draggingExited(_ sender: NSDraggingInfo?) { 
     NSLog("draggingExited") 
    } 

    override func draggingEnded(_ sender: NSDraggingInfo?) { 
     NSLog("draggingEnded") 
    } 

} 

Es macht keinen Unterschied, ob ich das zweite Feld in Main.storyboard über Vervielfältigung erstellen, oder wenn es erstellt wird (in Main.storyboard) als separate Operation. Ich habe alle Eigenschaften von jedem untersucht, und ich sehe keinen Unterschied zwischen ihnen (abgesehen von Object ID und Constraint Information).

Kann mir jemand erklären, warum ich ein unterschiedliches Verhalten (wenn die Datei auf das Feld fällt) zwischen diesen beiden Objekten bekomme, wenn ich das gleiche Objekt (Desktop-Datei) auf jedes von ihnen fallen lasse? Dasjenige, das zu dem Aufruf von prepareForDragOperation() führt, erwarte ich als korrektes Verhalten.

(Ich verwende Xcode 8.1, swift3, auf macOS Sierra 10.12.1)

Dank!

+0

Der Tropfen zu verwenden. – Willeke

Antwort

0

haben Sie versucht, auf das erste Textfeld zu defokussieren, und Drag Drop erneut?

Wenn es funktioniert, dann denke ich es, weil es ein unsichtbares Editorfeld ist, das direkt an der Spitze des Textfelds liegt, wenn es fokussiert wird, was es unmöglich macht, die Delegiertenmethode auszulösen.

so anstelle von Textfeld verwenden, versuchen Sie Textview auf dem fokussierten Textfeld wird durch den Feldeditor (`NSTextView`) behandelt