Objective c 转发拖拽&;将事件拖放到父视图

Objective c 转发拖拽&;将事件拖放到父视图,objective-c,cocoa,drag-and-drop,nsview,nsresponder,Objective C,Cocoa,Drag And Drop,Nsview,Nsresponder,我有一个应用程序,其中我有一个来自NSView的自定义视图。 在此视图中,有几个自定义子视图,它们也是从NSView派生的 我想实现一种拖放行为,允许将URL拖放到视图上。主视图中的所有内容都已正常工作 因此,实际上我必须在子视图和父视图类上实现拖动行为处理程序。 问题是,我不想将完整的处理代码复制到所有子视图,使它们也接受拖动事件。因此,我认为让它们将所有拖动事件转发到父视图是最好的方法 这有可能吗??我不确定我是否能用应答器链来设置这个 非常感谢任何提示!! 提前感谢。如果子视图仅用于显示,

我有一个应用程序,其中我有一个来自NSView的自定义视图。 在此视图中,有几个自定义子视图,它们也是从NSView派生的

我想实现一种拖放行为,允许将URL拖放到视图上。主视图中的所有内容都已正常工作

因此,实际上我必须在子视图和父视图类上实现拖动行为处理程序。 问题是,我不想将完整的处理代码复制到所有子视图,使它们也接受拖动事件。因此,我认为让它们将所有拖动事件转发到父视图是最好的方法

这有可能吗??我不确定我是否能用应答器链来设置这个

非常感谢任何提示!!
提前感谢。

如果子视图仅用于显示,不需要任何用户交互,您可以在父视图中覆盖
-hitTest:
,如下所示:

- (NSView *)hitTest:(NSPoint)aPoint
{
    NSView* hitView = [super hitTest:aPoint];
    if(hitView)
        return self;
    return nil;
}

这使父视图接收所有鼠标事件。

我遇到了一个类似的问题,我希望视图中的任何内容或其任何子视图都由视图处理,但调用从未到达那里

经过一些研究,我发现这个答案最有帮助:

基本上,如果一个视图没有注册以接收任何拖动事件,它应该自动将该信息传递给它的父视图。所以在我的例子中,我最终得到了这样的结果:

NSArray *subviews = [self.view subviews];
for (NSView *aSubview in subviews) {
    [aSubview unregisterDraggedTypes];
}
当然,您可以更加精确,并且确保只检查特定类型的子类或您想要的任何参数。但最终的关键是从它的拖拽类型中注销问题子视图


我希望这会有所帮助。

可能有更好的方法,但您可以将拖动协议实现放在一个类别中,而不是直接放在视图中,并将该类别包含在每个视图中。

仍然适用于XCode 10.1。Swift 4.2。根据10.14.4 Beta(18E184e)


不幸的是,我的子视图也接收到鼠标单击事件。还有其他想法吗?您可以通过覆盖父视图中的mouseUp:来单独传播鼠标单击事件,如果它位于其中一个子视图的矩形内,则向下传播。不太优雅:)这正是我需要的!!今晚我要试试!你的时机太棒了。还有其他问题需要解决,我昨天完成了最后一个问题。所以我很快就会问一个关于这个话题的新问题。谢谢让我一天都很愉快试过之后,我觉得没用。。。直到我发现,我的自定义视图包含一个NSImageView,该视图显示一个着色图像作为整个视图的覆盖。这吃掉了我所有的拖拽事件
UnregisterDragedType
解决了我的问题。非常感谢你!!
// MARK: - ViewController lifecycle

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.subviews.forEach { $0.unregisterDraggedTypes() }
}