如果子视图拒绝它,则超级视图作为拖动目标

时间:2012-06-10 16:39:54

标签: objective-c macos drag-and-drop osx-lion nsview

考虑带有子视图(parent)的视图(child)。两者都注册了拖动类型NSFilenamesPboardType

parent仅对音频文件中的图像文件和child感兴趣。如果他们在draggingEntered:中检测到相应类型的文件,则会返回NSDragOperationCopy。如果没有,他们会返回NSDragOperationNone

child重叠parent,当拖动到达child时,parent会收到draggingExited:消息,无论child是否感兴趣阻力与否。

如果parent不想要它,我该如何让child收到拖动?

3 个答案:

答案 0 :(得分:3)

如果我说得对,你应该致电:

[self.superview yourmethod];

在childs函数中。

如果孩子从父母那里继承,你可以致电:

[super yourmethod];

答案 1 :(得分:2)

你可以在这里做几件事:

  1. 正如@Thomas所提到的,您可以在子视图中实现逻辑,以确定是否应将拖动事件转发到父视图并在适当时转发事件。

  2. 您可以取消注册子视图以接收拖动消息([childView unregisterDraggedTypes]),然后您可以在parentView中实现拖动的所有逻辑。本质上,想法是计算拖动的类型和位置以及它是否与子视图相交。如果它与子视图相交,则应用子视图的拖动逻辑。否则,应用父视图的拖动逻辑。您可能需要实现draggingUpdated:才能完成此任务。

答案 2 :(得分:1)

您可以考虑将父项作为唯一注册NSFilenamesPboardType的项目。

与UIResponderChain一样,为每个子视图创建一个类别

- (NSView*) dragTest:(id< NSDraggingInfo >)sender;

如果返回的值为nil,则表示子视图(及其子驱动程序)不希望处理拖动事件。

现在回到父视图,当draggingEntered:触发时,计算位置并找出它所在的视图,调用dragTest:检查相应的子视图是否希望处理它。让返回的非null视图处理事件,否则在父级中处理它。

如果您有多种级别的子视图,此方法将非常有用。