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
中,NSImageView
s 自己接受拖动事件,因此它正在抓取拖动事件而不用它做任何事情。如果您的子视图是自定义类,您可以 a) 不实现拖放,在这种情况下,拖动将通过; b) 实现拖放以接受子视图的拖动。在这种情况下,您正在使用一个您无法控制的类。如果你想要它做的只是显示一个图像,你应该能够创建另一个 NSView
子类,除了在 drawRect:
中绘制图像之外什么都不做
【讨论】:
感谢您的输入,它运行良好。主要我的问题是第一个问题,为什么我没有将其标记为已接受,但我正在竖起大拇指。再次感谢。 有了这些细节,我就有了你剩下的答案。祝你好运,谢谢你的支持! @Bavarious:肯定不会让他们通过;我不能确定它对他们做了什么。我猜只是返回NSDragOperationNone
。如果您有与 OP 类似的情况,图像视图略小于启用拖动的超级视图,您可以在图像视图“周围”进行拖动,但不能在鼠标进入图像视图的框架时进行。
如上所述(并链接到原始source)答案是使用[imageView unregisterDraggedTypes];
取消注册NSImageView的拖动类型【参考方案2】:
如 cmets 中所述,NSImageViews 默认启用自己的拖放功能(用于接受拖到 NSImageView 上的图像)。如果您不想使用此行为,而是想使用超级视图的拖放行为,则需要在 NSImageView 中取消注册拖动行为。
对象:
[imageView unregisterDraggedTypes];
斯威夫特:
imageView.unregisterDraggedTypes()
(以防其他人首先偶然发现这个问题,而不是 cmets 中的链接问题)
【讨论】:
以上是关于Cocoa NSView 子视图阻止拖放的主要内容,如果未能解决你的问题,请参考以下文章