5

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

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

child重叠parent,当拖动到达 时,无论是否对拖动感兴趣childparent都会收到一条消息。draggingExited:child

如果不想要,我怎样才能parent收到阻力?child

4

3 回答 3

3

如果我做对了,您应该致电:

[self.superview yourmethod];

在孩子的功能。

如果孩子从父母那里继承,您可以调用:

[super yourmethod];
于 2012-06-13T11:04:35.553 回答
2

您可以在这里做几件事:

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

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

于 2012-06-13T18:59:21.973 回答
1

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

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

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

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

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

如果您有许多级别的子视图,此方法将很有帮助。

于 2012-06-18T10:36:36.910 回答