Image 自定义NSView拖放图像

Image 自定义NSView拖放图像,image,cocoa,drag-and-drop,nsview,Image,Cocoa,Drag And Drop,Nsview,我正在开发一个OSX应用程序,我似乎无法通过拖放来工作。我在谷歌上搜索了很多,但大多数关于这个主题的帖子都至少有几年的历史了,没有一篇能告诉我我思想中缺失的链接 不管怎样,这就是我要做的。我的桌面上有一个图像,我希望能够将它拖放到我的自定义视图中。自定义视图是名为CircularImageView的自定义NSView的子对象,具有图层背景,仅在屏幕上显示圆形图像 代码如下: import Cocoa import MCTools @objc public protocol DragAndDro

我正在开发一个OSX应用程序,我似乎无法通过拖放来工作。我在谷歌上搜索了很多,但大多数关于这个主题的帖子都至少有几年的历史了,没有一篇能告诉我我思想中缺失的链接

不管怎样,这就是我要做的。我的桌面上有一个图像,我希望能够将它拖放到我的自定义视图中。自定义视图是名为CircularImageView的自定义NSView的子对象,具有图层背景,仅在屏幕上显示圆形图像

代码如下:

import Cocoa
import MCTools

@objc public protocol DragAndDropCircularImageViewDelegate {
    func imageDumped(sender: AnyObject!)
}

@IBDesignable @objc public class DragAndDropCircularImageView: CircularImageView {
    // This class provides the Drag And Drop Feature to the CircularImageView Class.

    // MARK: New in this class

    var highlight: Bool = false
    public var delegate: DragAndDropCircularImageViewDelegate?

    private func registerForDraggedImages() {
        self.registerForDraggedTypes(NSImage.imageTypes())
    }

    // MARK: CircularImageView Stuff

    public override var image: NSImage? {
        didSet {
            if let newImage = image {
                delegate?.imageDumped(self)
            }
        }
    }

    public required init?(coder: NSCoder) {
        super.init(coder: coder)
        self.registerForDraggedImages()
    }

    public override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        self.registerForDraggedImages()
    }

    public override func updateLayer() {
        super.updateLayer()

        if highlight == true {

        }
    }

    // MARK: NS Dragging Destination Protocol

    public override func draggingEntered(sender: NSDraggingInfo) -> NSDragOperation {
        // When a drag enters our drop zone.
        if NSImage.canInitWithPasteboard(sender.draggingPasteboard()) {
            if ((sender.draggingSourceOperationMask().rawValue & NSDragOperation.Copy.rawValue) > 0) {
                highlight = true
                self.needsLayout = true

                sender.enumerateDraggingItemsWithOptions(.Concurrent, forView: self, classes: [NSPasteboardItem.self], searchOptions: [NSPasteboardURLReadingContentsConformToTypesKey: self], usingBlock: { (draggingItem, idx, stop) -> Void in

                    return
                })
            }
            return NSDragOperation.Copy
        }
        return NSDragOperation.None
    }

    public override func draggingExited(sender: NSDraggingInfo?) {
        // When drag exits our drop zone remove highlight of the drop zone.
        println("\(self)draggingExited")
        highlight = false
        self.needsLayout = true
    }

    public override func prepareForDragOperation(sender: NSDraggingInfo) -> Bool {
        // Update view for hovering drop.
        println("\(self)prepareForDragOperation")
        highlight = false
        self.needsLayout = true
        // Can we accept the drop?
        return NSImage.canInitWithPasteboard(sender.draggingPasteboard())
    }

    public override func performDragOperation(sender: NSDraggingInfo) -> Bool {
        // Handle the drop data.
        println("\(self)performDragOperation \(sender)")
        if NSImage.canInitWithPasteboard(sender.draggingPasteboard()) {
            self.image = NSImage(pasteboard: sender.draggingPasteboard())
        }
        return true
    }

    // MARK: Interface Builder Stuff
}
我看到了一些我应该使用的帖子:

self.registerForDraggedTypes([NSFilenamesPboardType])
而不是:

self.registerForDraggedTypes(NSImage.imageTypes())
但在我的情况下,这似乎不起作用,当我使用NSFileNamespoardType时,甚至在调用任何NSDraggingDestination协议消息之前,我都会收到以下调试消息:

2015-05-07 11:07:19.583 CircularImageViewTest[44809:14389647] -[CircularView.DragAndDropCircularImageView copyWithZone:]: unrecognized selector sent to instance 0x608000166d80
(lldb) p 0x608000166d80
(Int) $R0 = 106102873550208
我不明白这是怎么回事。在某个地方,框架试图在整数上复制WithZone?谁能给我解释一下吗


任何帮助都将不胜感激。提前感谢。

好的,下面的代码可以工作。这一切都是由sender.EnumeratingDraggingItems中的选项引起的。苹果的框架在被调用时出现了一些问题

import Cocoa
import MCTools

@objc public protocol DragAndDropCircularImageViewDelegate {
    func imageDumped(sender: AnyObject!)
}

@IBDesignable @objc public class DragAndDropCircularImageView: CircularImageView {
    // This class provides the Drag And Drop Feature to the CircularImageView Class.

    // MARK: New in this class

    var highlight: Bool = false
    public weak var delegate: DragAndDropCircularImageViewDelegate?

    private func registerForDraggedImages() {
//        self.registerForDraggedTypes(NSImage.imageTypes())
        self.registerForDraggedTypes([NSFilenamesPboardType])
    }

    // MARK: CircularImageView Stuff

    public override var image: NSImage? {
        didSet {
            if let newImage = image {
                delegate?.imageDumped(self)
            }
        }
    }

    public required init?(coder: NSCoder) {
        super.init(coder: coder)
        self.registerForDraggedImages()
    }

    public override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        self.registerForDraggedImages()
    }

    public override func updateLayer() {
        super.updateLayer()

        if highlight == true {

        }
    }

    // MARK: NS Dragging Destination Protocol

    public override func draggingEntered(sender: NSDraggingInfo) -> NSDragOperation {
        // When a drag enters our drop zone.
        if NSImage.canInitWithPasteboard(sender.draggingPasteboard()) {
            if ((sender.draggingSourceOperationMask().rawValue & NSDragOperation.Copy.rawValue) > 0) {
                highlight = true
                self.needsLayout = true
            }
            return NSDragOperation.Copy
        }
        return NSDragOperation.None
    }

    public override func draggingExited(sender: NSDraggingInfo?) {
        // When drag exits our drop zone remove highlight of the drop zone.
        println("\(self)draggingExited")
        highlight = false
        self.needsLayout = true
    }

    public override func prepareForDragOperation(sender: NSDraggingInfo) -> Bool {
        // Update view for hovering drop.
        println("\(self)prepareForDragOperation")
        highlight = false
        self.needsLayout = true
        // Can we accept the drop?
        return NSImage.canInitWithPasteboard(sender.draggingPasteboard())
    }

    public override func performDragOperation(sender: NSDraggingInfo) -> Bool {
        // Handle the drop data.
        println("\(self)performDragOperation \(sender)")
        if NSImage.canInitWithPasteboard(sender.draggingPasteboard()) {
            self.image = NSImage(pasteboard: sender.draggingPasteboard())
            self.delegate!.imageDumped(self)
        }
        return true
    }

    // MARK: Interface Builder Stuff
}