2011-05-05 69 views
7

我有一个的NSView子类,其登记为拖动文件init方法是这样的:可可的NSView子视图阻断拖/放

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

的拖放工作完全正常,但如果我添加一个子视图这种观点与完全相同的框架,它不再工作。我的猜测是,子视图阻止拖动事件进入超级视图。我能避免吗?谢谢

此外,我知道我问了两个问题,但我不想为此创建一个新主题:当我拖动时,光标不会像其他人一样更改为“+”号拖,我该怎么做? 再次感谢。

UPDATE: 这里是我怎么也得在我的IB成立: enter image description here

的drawView函数是我说的是,对于draggedtypes注册自定义类。并且图像视图仅仅是一个子视图,我拖着图像从媒体节... 如果有帮助,这是我的相关代码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; 
} 
+0

你是如何创建子视图?我可以通过IB或以编程方式将子视图拖入视图。 – 2011-05-05 04:42:26

+0

我有建立在IB的观点。我将它设置为上面描述的自定义类的类。然后在IB中,我拖动图像并将其放入该视图(使其成为子视图)。当我这样做时,拖动停止工作。谢谢。 – user635064 2011-05-05 04:54:28

+0

更新了提供更多详细信息的原始问题。谢谢。 – user635064 2011-05-05 05:05:35

回答

4

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

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

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

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

好的,答案不幸的是,你不能。您拖动的图像包含在NSImageView中,而NSImageView本身接受拖动事件,因此它抓取拖动事件并且不执行任何操作。如果您的子视图是自定义类,则可以:a)不执行拖放操作,在这种情况下拖动传递; b)实现拖放以接受子视图的拖动。在这种情况下,你正在使用一个你没有任何控制权的类。如果所有你想要它做的是显示一个图像,你应该能够做另一个NSView的子类,但什么都不做,只能绘制图像drawRect:

+0

感谢您的输入,它的工作完美。主要是我的问题是第一个问题,那就是为什么我没有将其标记为已接受,但是我正在赞扬它。再次感谢。 – user635064 2011-05-05 04:56:10

+0

有了这些细节,我有你的答案的其余部分。祝你好运,谢谢你的支持! – 2011-05-05 05:24:03

+0

非常感谢您的澄清! – user635064 2011-05-05 05:30:20