Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了可可 – NSStatusItem自定义视图NSDraggingDestination仅在点击项目后才能工作大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我有一个NSStatusItem与自定义视图实现NSDraggingDesTination协议.但是,只有当状态项目被点击/激活至少一次时,拖放才有效.我想要自定义视图接受滴不管. 一个gif来展示这个问题: 代码从上面的例子(或Xcode Project): import Cocoa class AppDelegate: NSObject, NSApplicationDelegate {
我有一个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测试了您的项目,并且药物工作很好.

大佬总结

以上是大佬教程为你收集整理的可可 – NSStatusItem自定义视图NSDraggingDestination仅在点击项目后才能工作全部内容,希望文章能够帮你解决可可 – NSStatusItem自定义视图NSDraggingDestination仅在点击项目后才能工作所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。