考虑带有子视图(parent
)的视图(child
)。两者都注册了拖动类型NSFilenamesPboardType
。
parent
仅对音频文件中的图像文件和child
感兴趣。如果他们在draggingEntered:
中检测到相应类型的文件,则会返回NSDragOperationCopy
。如果没有,他们会返回NSDragOperationNone
。
child
重叠parent
,当拖动到达child
时,parent
会收到draggingExited:
消息,无论child
是否感兴趣阻力与否。
如果parent
不想要它,我该如何让child
收到拖动?
答案 0 :(得分:3)
如果我说得对,你应该致电:
[self.superview yourmethod];
在childs函数中。
如果孩子从父母那里继承,你可以致电:
[super yourmethod];
答案 1 :(得分:2)
你可以在这里做几件事:
正如@Thomas所提到的,您可以在子视图中实现逻辑,以确定是否应将拖动事件转发到父视图并在适当时转发事件。
您可以取消注册子视图以接收拖动消息([childView unregisterDraggedTypes]
),然后您可以在parentView中实现拖动的所有逻辑。本质上,想法是计算拖动的类型和位置以及它是否与子视图相交。如果它与子视图相交,则应用子视图的拖动逻辑。否则,应用父视图的拖动逻辑。您可能需要实现draggingUpdated:
才能完成此任务。
答案 2 :(得分:1)
您可以考虑将父项作为唯一注册NSFilenamesPboardType的项目。
与UIResponderChain一样,为每个子视图创建一个类别
- (NSView*) dragTest:(id< NSDraggingInfo >)sender;
如果返回的值为nil,则表示子视图(及其子驱动程序)不希望处理拖动事件。
现在回到父视图,当draggingEntered:触发时,计算位置并找出它所在的视图,调用dragTest:检查相应的子视图是否希望处理它。让返回的非null视图处理事件,否则在父级中处理它。
如果您有多种级别的子视图,此方法将非常有用。