禁用 WebView 的拖放以支持其超级视图之一

Posted

技术标签:

【中文标题】禁用 WebView 的拖放以支持其超级视图之一【英文标题】:Disable drag and drop for WebView in favor for one of its superviews 【发布时间】:2013-06-17 07:36:19 【问题描述】:

我正在开发像 Mac Mail 这样的应用程序。我有一个允许用户编写新消息的 WebView。我实现了拖放功能,以便用户可以通过这种方式将附件添加到消息中。

为了简单起见,我有一个包含 WebView 和其他视图的主视图。我在这个主视图上实现了拖放(使用 draggingEntered: 和 performDragOperation: 方法),它按预期工作。

问题是默认情况下,当在 WebView 中拖动文件时,例如图像,图像将显示在 WebView 中。但我不希望这样,我希望它作为附件添加,这就是为什么我禁用了 WebView 内的拖放:

  def webView(sender, dragDestinationActionMaskForDraggingInfo:draggingInfo)
    WebDragDestinationActionNone
  end

但现在,如果我将文件拖到主视图内的任何位置,WebView 除外(在这种情况下不调用 draggingEntered: 和 performDragOperation: 方法),现在我的文件将作为附件添加。

我不知道我的问题是否足够清楚可以找到答案,我还是 Cocoa 开发的新手,所以如果您需要更多详细信息,请随时告诉我。另一件事,我正在使用 Rubymotion,但如果您在 Objective-C 中找到了解决方案,那也将是完美的!

感谢您的任何帮助或建议。

解决方案

我继承了 WebView 并覆盖了 performDragOperation 方法以使其工作:

def performDragOperation(sender)
  self.UIDelegate.mainView.performDragOperation(sender)
end

【问题讨论】:

【参考方案1】:

您可以检查目标窗口的sender(实现NSDraggingInfo 协议):

http://developer.apple.com/library/Mac/#documentation/Cocoa/Reference/ApplicationKit/Protocols/NSDraggingInfo_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/NSDraggingInfo/draggingDestinationWindow

def performDragOperation(sender)
  if sender.draggingDestinationWindow == @web_view
    # Attach file
  else
    # Let it do the normal drag operation
  end
  true
end

这只是一个猜测,但您应该能够从这里找出解决方案。

【讨论】:

感谢您的回答,我没有使用 draggingDestinationWindow 方法,但能够通过将 webview 子类化并覆盖 performDragOperation 方法来解决问题,这得到了另一个答案的帮助:***.com/questions/12742276/…。但你让我走对了路,所以我会接受你的回答。

以上是关于禁用 WebView 的拖放以支持其超级视图之一的主要内容,如果未能解决你的问题,请参考以下文章

表单中的拖放功能仍处于禁用状态

如何仅在android中限制沿y轴的拖放?

android 2.2 中的拖放布局

如果没有放在目标上,则使用 onDraglistener animate 拖放以返回原始位置

HTML5拖放以使用本地htnl5文件上传目录[重复]

使用核心数据存储对 NSTableView 的拖放支持