gpt4 book ai didi

cocoa - NSStatusItem 自定义 View NSDraggingDestination 仅在单击项目后有效

转载 作者:IT王子 更新时间:2023-10-29 05:38:00 36 4
gpt4 key购买 nike

我有一个带有自定义 View 的 NSStatusItem,它实现了 NSDraggingDestination 协议(protocol)。但是,拖放只有在状态项至少被单击/激活一次时才有效。我希望自定义 View 无论如何都接受掉落。

展示问题的 gif: 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")
}
}

也许这是一个错误,或者我只是遗漏了一些东西。为什么会发生这种情况,我能做些什么来防止这种行为?

最佳答案

看起来这是一个错误。我刚刚使用 XCode 6.1.1 和 OS X 10.10.2 测试了您的项目,下药效果很好。

关于cocoa - NSStatusItem 自定义 View NSDraggingDestination 仅在单击项目后有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24986114/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com