drag-and-dropnstextviewnswindowcontrollernsviewcontroller

How do I disable drag and drop on NSTextView?


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?


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.