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!
Der Tropfen zu verwenden. – Willeke