Custom Cut,Copy&粘贴WKWebView的操作

时间:2015-03-31 19:07:19

标签: macos cocoa wkwebview

我正在开发一个Cocoa应用程序来包装我开发的JavaScript Web应用程序,它提供了SVG图形的编辑。我有以下问题,这是因为希望自定义剪切,复制和粘贴操作及其相关的菜单项。

我怎么能:

  • 用我自己的响应者代替WKWebView或
  • 自定义对validateMenuItem:cut:copy:paste:选择器的回复?

我对保留有用的WKWebView功能的解决方案特别感兴趣,它为文本字段提供剪切,复制和粘贴。

非常感谢任何帮助。细节如下。


我的Cocoa包装器的目的有三个:

  1. 提供持久性
  2. 提供剪贴板集成
  3. 提供打印
  4. 我已经达到了1,但在2和3时被阻止了;这个问题大约是2。

    具体来说,我无法让框架调用我提供的validateMenuItem:的任何实现 - 因此,我无法控制切割,复制或粘贴菜单项何时可供用户选择。

    我尝试了以下内容:

    1. 将我的NSViewController子类标记为接受第一响应者并覆盖validateMenyItem: - 我的实现从未被调用
    2. 子类WKWebView并覆盖validateMenuItem: - 我的实现从未被调用
    3. 子类NSWindowController并覆盖validateMenuItem: - 我的实现从未被调用
    4. 现在,我的包装网络应用程序有一些文本字段。当我给出其中一个焦点并且适当时(文本在剪贴板上;我突出显示一些文本),编辑菜单中的剪切,复制和粘贴选项会自动激活。他们甚至工作。 (我喜欢这个功能,并希望保留它。)因此我怀疑发生的事情是WKWebView作为我当前的第一响应者,正在拦截响应者链上对validateMenuItem:的任何调用。但我还需要能够根据我的包装网页应用程序中的其他状态激活菜单项 - 例如,当用户选择SVG图形时。


      更新

      我已经做了额外的挖掘,试图找出解决问题的方法。在我的WKWebView子类中,我添加了一个自定义@IBAction。我在故事板上为它创建了一个菜单项,并将菜单项连接到FirstResponder,选择我的新动作。

      我的WKWebView子类上的validateMenuItem:被调用了。但用于该新选择器,而不是与我之前添加到我的WKWebView子类的copy:相关联的@IBAction选择器。

      现在,我的copy:方法标记为@IBAction并且具有Interface Builder(或者现在所谓的任何东西)能够使用的方法签名,并未标记为override。当我尝试将其标记为override时,我收到了错误消息。显然,WKWebView不提供copy:id方法 - 即使它选择了文本字段中的文本,它提供了复制功能并正确处理菜单项。

      因此,似乎WKWebView会自动(并且始终)处理通常绑定到菜单的某些选择器的验证 - 具体来说,cut:copy:paste:。此外,继承WKWebView并覆盖validateMenuItem:不足以中断/控制此默认行为。哪个似乎奇数。

      但是通过阅读StackOverflow上WKWebView上的其他帖子,我知道WKWebView实际上是一个非常复杂的功能。我特别感兴趣的是,WKWebView实际上是在一个单独的过程中运行Web内容。因此,我想知道与该单独流程相关的内容是否负责菜单验证和处理cut:copy:paste: - 框架内部以及我无法访问的内容。

      我仍然希望找到解决方案。希望上述更新证明是有用的。

2 个答案:

答案 0 :(得分:0)

奇怪的是,我还在考虑通过WKWebView将矢量设计工具移植到Mac并遇到同样的问题。看起来您实际上可以控制来自inside JavaScript的剪切/复制/粘贴菜单项。如果您添加beforecopybeforecut事件处理程序以及preventDefault(),则会启用剪切和复制菜单项。我似乎无法启用粘贴菜单项。我想这可能是由于long-running bug in WebKit。您仍然可以在键盘上使用⌘-V,并且粘贴仍然会发生,因为在这种情况下,WebKit将跳过调用beforepaste并直接触发paste事件。我只是无法弄清楚启用粘贴菜单项。作为一种解决方法,我创建了一个“假”粘贴菜单选项,它不会转到普通paste:选择器,而是转到我自己的选择器,WKWebView不会拦截。

答案 1 :(得分:0)

... 5年后....

请看看我对另一个问题的回答:Manipulate paste content in WKWebView此解决方案涉及方法Swizzling,也可能很容易解决您的问题。