我有一个带有自定义视图的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")
}
}
也许这是一个错误,或许我只是遗漏了一些东西。为什么会发生这种情况,我能做些什么来阻止这种行为?
答案 0 :(得分:1)
看起来这是一个错误。我刚刚使用XCode 6.1.1和OS X 10.10.2测试了您的项目,并且药物治疗效果很好。