У меня есть NSStatusItem с настраиваемым представлением, которое реализует протокол NSDraggingDestination. Однако перетаскивание выполняется только в том случае, если элемент статуса был нажат/активирован хотя бы один раз. Я хочу, чтобы пользовательское представление принимало кавычки независимо.
A gif, чтобы продемонстрировать проблему:
Код из приведенного выше примера (или Xcode Project):
import Cocoa
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(aNotification: NSNotification?) {
let vc = StatusItemViewController()
}
func applicationWillTerminate(aNotification: NSNotification?) {
// Insert code here to tear down your application
}
}
class StatusItemView: NSView, NSDraggingDestination {
public var image = NSImage(named: "NSQuickLookTemplate")
public var action: Selector?
public var target: AnyObject?
private var statusItem: NSStatusItem
init(statusItem: NSStatusItem) {
let itemWidth = statusItem.length
let itemHeight = NSStatusBar.systemStatusBar().thickness
self.statusItem = statusItem
super.init(frame: NSRect(x: 0.0, y: 0.0, width: itemWidth, height: itemHeight))
var types = [NSURLPboardType, NSStringPboardType] as [String]
for type in NSImage.imagePasteboardTypes() {
types.append(type as String)
}
self.registerForDraggedTypes(types)
statusItem.view = self
}
override func drawRect(dirtyRect: NSRect) {
let iconSize = image.size
let bounds = self.bounds
let iconX = round((bounds.width - iconSize.width)/2)
let iconY = round((bounds.height - iconSize.height)/2)
image.drawAtPoint(NSPoint(x: iconX, y: iconY), fromRect: NSRect(), operation: NSCompositingOperation.CompositeOverlay, fraction: 1.0)
}
override func mouseDown(theEvent: NSEvent!) {
if let _action = self.action {
NSApp.sendAction(_action, to: self.target, from: self)
}
}
override func performDragOperation(sender: NSDraggingInfo!) -> Bool {
println("Performed")
return true
}
override func draggingEntered(sender: NSDraggingInfo!) -> NSDragOperation {
return NSDragOperation.Copy
}
override func draggingUpdated(sender: NSDraggingInfo!) -> NSDragOperation {
println("Dragging")
return NSDragOperation.Copy
}
override func draggingExited(sender: NSDraggingInfo!) {
println("Exit")
}
}
class StatusItemViewController: NSObject {
private var statusBarItem: NSStatusItem?
private var statusItemView: StatusItemView!
init() {
self.statusBarItem = NSStatusBar.systemStatusBar().statusItemWithLength(24)
super.init()
if let item = statusBarItem {
statusItemView = StatusItemView(statusItem: item)
statusItemView.target = self
statusItemView.action = "doAction:"
} else {
println("Unable to create status item, terminating self")
NSApplication.sharedApplication().terminate(nil)
}
}
deinit {
NSStatusBar.systemStatusBar().removeStatusItem(statusBarItem)
statusBarItem = nil
statusItemView = nil
}
func doAction(sender: AnyObject!) {
println("Here is where one would perform the action")
}
}
Возможно, это ошибка или, возможно, я просто что-то пропустил. Почему это происходит и есть ли что-нибудь, что я могу сделать, чтобы предотвратить это поведение?