2

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?

mmackh
  • 3,550
  • 3
  • 35
  • 51

4 Answers4

7

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.

mmackh
  • 3,550
  • 3
  • 35
  • 51
5

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]()
}
Kevin Sliech
  • 421
  • 6
  • 16
1

Swift 5

import Cocoa

class NSTextViewNoDrop: NSTextView {

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

}
vomi
  • 993
  • 8
  • 18
0

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]()
    }
}
marxy
  • 416
  • 2
  • 10