我有一个NSStatusItem与自定义视图实现NSDraggingDestination协议.但是,只有当状态项目被点击/激活至少一次时,拖放才有效.我想要自定义视图接受滴不管.
一个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") } }
也许这是一个错误,也许我只是错过了一些东西.为什么会发生这种情况,有什么可以做的,以防止这种行为?
看起来像是一个bug.我刚刚使用XCode 6.1.1和OS X 10.10.2测试了您的项目,并且药物工作很好.