【问题标题】:Cocoa NSView subview blocking drag/dropCocoa NSView 子视图阻止拖放
【发布时间】: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 在这个线程上的回答:stackoverflow.com/questions/4782636/…

标签: objective-c cocoa macos drag-and-drop nsview


【解决方案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 中的链接问题)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多