Cocoa NSView 子视图阻止拖放

Posted

技术标签:

【中文标题】Cocoa NSView 子视图阻止拖放【英文标题】:Cocoa NSView subview blocking drag/drop 【发布时间】:2011-08-19 01:06:14 【问题描述】:

我有一个 NSView 子类,它在 init 方法中注册拖动文件,如下所示:

    [self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];

拖放工作非常好,但如果我向这个视图添加一个具有完全相同框架的子视图,它就不再工作了。我的猜测是子视图阻止拖动事件进入超级视图。我可以避免吗?谢谢

另外,我知道我在问两个问题,但我不想为此创建一个新主题:当我拖动时,我的光标不会像其他拖动一样变为“+”号,我怎样才能做到这一点? 再次感谢。

更新: 这是我在 IB 中的设置方式:

DrawView 是我所说的为拖动类型注册的自定义类。而图像视图只是一个子视图,我从媒体部分拖了一个图像...... 如果有帮助,这是我的 DragView 相关代码:

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender 
    return NSDragOperationCopy;


- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender 
    NSPasteboard *pboard;
    pboard = [sender draggingPasteboard];
    NSArray *list = [pboard propertyListForType:NSFilenamesPboardType];
    if ([list count] == 1) 
        BOOL isDirectory = NO;
        NSString *fileName = [list objectAtIndex:0];
        [[NSFileManager defaultManager] fileExistsAtPath:fileName
                                             isDirectory: &isDirectory];
        if (isDirectory) 
            NSLog(@"AHH YEA");
         else 
            NSLog(@"NOO");
        
    
    return YES;

【问题讨论】:

你是如何创建子视图的?我可以通过 IB 或以编程方式创建具有子视图的视图。 我在 IB 中设置了视图。我将它的类设置为我上面描述的自定义类。然后在 IB 中,我拖动图像并将其放在该视图中(使其成为子视图)。当我这样做时,拖动停止工作。谢谢。 更新了原始问题,提供了更多详细信息。谢谢。 看看 Steven 在这个线程上的回答:***.com/questions/4782636/… 【参考方案1】:

你问题第二部分的答案是这样的:

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
    return NSDragOperationCopy;

如果您返回NSDragOperationCopy,您将获得用于复制操作的鼠标徽章。 (当然,您可以而且应该不只是无条件返回NSDragOperationCopy;检查粘贴板上的对象,看看您是否可以接受。)

我不确定您问题第一部分的答案是什么,因为我无法重新创建子视图阻止效果。

好吧,很遗憾,答案是你不能。您拖动的图像包含在NSImageView 中,NSImageViews 自己接受拖动事件,因此它正在抓取拖动事件而不用它做任何事情。如果您的子视图是自定义类,您可以 a) 不实现拖放,在这种情况下,拖动通过; b) 实现拖放以接受子视图的拖动。在这种情况下,您正在使用一个您无法控制的类。如果你想要它做的只是显示一个图像,你应该能够创建另一个 NSView 子类,除了在 drawRect: 中绘制图像之外什么都不做

【讨论】:

感谢您的输入,它运行良好。主要我的问题是第一个问题,为什么我没有将其标记为已接受,但我正在竖起大拇指。再次感谢。 有了这些细节,我就有了你剩下的答案。祝你好运,谢谢你的支持! @Bavarious:肯定不会让他们通过;我不能确定它对他们做了什么。我猜只是返回NSDragOperationNone。如果您有与 OP 类似的情况,图像视图略小于启用拖动的超级视图,您可以在图像视图“周围”进行拖动,但不能在鼠标进入图像视图的框架时进行。 如上所述(并链接到原始source)答案是使用[imageView unregisterDraggedTypes];取消注册NSImageView的拖动类型【参考方案2】:

如 cmets 中所述,NSImageViews 默认启用自己的拖放功能(用于接受拖到 NSImageView 上的图像)。如果您不想使用此行为,而是想使用超级视图的拖放行为,则需要在 NSImageView 中取消注册拖动行为。

对象:

[imageView unregisterDraggedTypes];

斯威夫特:

imageView.unregisterDraggedTypes()

(以防其他人首先偶然发现这个问题,而不是 cmets 中的链接问题)

【讨论】:

以上是关于Cocoa NSView 子视图阻止拖放的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa - 从 nib 加载视图并将其显示在 NSView 容器中,作为子视图

NSView 子视图的 Alpha 值

H5 拖放

chapter9 拖放

HTML5之拖拽和拖放

Cocoa:拖放任何文件类型