2

我有一个NSWindowController包含几个NSViewControllers. 我想普遍接受带有 NSWindowController 类的拖放事件,并且不会被其他视图拦截,例如NSTextView(包含在 a 中NSViewController

我怎么知道NSTextView忽略拖放事件?

4

4 回答 4

6

我发现有两件事需要跳过过去NSTextView对拖放事件的拦截。

NSViewController包含您的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];
    }
}

现在将您的子类化NSTextView并添加此方法:

- (NSArray *)acceptableDragTypes
{
    return nil;
}

现在NSTextView应该正确地忽略拖放事件并让它由 NSWindow 处理。

于 2013-05-10T12:45:55.597 回答
5

将 NSTextView 子类化并覆盖其acceptableDragTypes属性的 getter 就足够了,无需unregisterDraggedTypes. 在斯威夫特:

override var acceptableDragTypes : [String] {
    return [String]()
}
于 2016-02-17T05:31:02.087 回答
1

斯威夫特 5

import Cocoa

class NSTextViewNoDrop: NSTextView {

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

}
于 2019-04-06T08:47:01.190 回答
0

轻微更新。

import Cocoa

class MyTextView : NSTextView {
    // don't accept any drag types into the text view
    override var acceptableDragTypes : [NSPasteboard.PasteboardType] {
        return [NSPasteboard.PasteboardType]()
    }
}
于 2019-03-03T06:34:05.187 回答