- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个带有自定义 View 的 NSStatusItem,它实现了 NSDraggingDestination 协议(protocol)。但是,拖放只有在状态项至少被单击/激活一次时才有效。我希望自定义 View 无论如何都接受掉落。
展示问题的 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/
我想在我的 Mac 应用程序中实现一些“简单”的拖放操作。我拖入一个 View 并相应地在我的 nib 文件中输入“MyView”。但是,我在控制台中没有收到任何响应(每当触发任何协议(protoco
我有一个带有自定义 View 的 NSStatusItem,它实现了 NSDraggingDestination 协议(protocol)。但是,拖放只有在状态项至少被单击/激活一次时才有效。我希望自
我正在致力于在非 C 环境中使用 Cocoa 的拖放 API。我必须使用 objc/runtime.h 函数,因此我需要了解必须在何处注入(inject)必要的方法。 现在,SDK 文档说,首先在 N
我正在将一个使用 WebView 的 OS X 应用程序移植到使用 WKWebView,这是 OS X Yosemite 中引入的新的“现代 WebKit API”。我以前的 WebView 子类支持
我是一名优秀的程序员,十分优秀!