Question

I have a NSWindowController that contains several NSViewControllers. I would like to universally accept drag and drop events with the NSWindowController class and not be intercepted by other views such as NSTextView (contained in a NSViewController)

How can I tell NSTextView to ignore the drag & drop event?

Était-ce utile?

La solution

I found out that there were two things needed to skip past NSTextView's interception of the drag and drop event.

In the NSViewController containing your NSTextView:

- (void)awakeFromNib
{
    [self noDragInView:self.view];
}

- (void)noDragInView:(NSView *)view
{
    for (NSView *subview in view.subviews)
    {
        [subview unregisterDraggedTypes];
        if (subview.subviews.count) [self noDragInView:subview];
    }
}

Now subclass your NSTextView and add this method:

- (NSArray *)acceptableDragTypes
{
    return nil;
}

The NSTextView should now properly ignore the drag and drop event and leave it to be handled by the NSWindow.

Autres conseils

It is sufficient to subclass the NSTextView and override the getter for its acceptableDragTypes property, no need to unregisterDraggedTypes. In Swift:

override var acceptableDragTypes : [String] {
    return [String]()
}

Swift 5

import Cocoa

class NSTextViewNoDrop: NSTextView {

    override var acceptableDragTypes: [NSPasteboard.PasteboardType] { return [] }

}

Slight update.

import Cocoa

class MyTextView : NSTextView {
    // don't accept any drag types into the text view
    override var acceptableDragTypes : [NSPasteboard.PasteboardType] {
        return [NSPasteboard.PasteboardType]()
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top