WKWebView 的自定义剪切、复制和粘贴操作
Posted
技术标签:
【中文标题】WKWebView 的自定义剪切、复制和粘贴操作【英文标题】:Custom Cut, Copy & Paste operations for WKWebView 【发布时间】:2015-03-31 19:07:18 【问题描述】:我正在开发一个 Cocoa 应用程序来包装我开发的 javascript Web 应用程序,该应用程序提供 SVG 图形的编辑。我有以下问题,其动机是希望自定义剪切、复制和粘贴操作及其相关菜单项。
我该怎么做:
用我自己的响应者代替 WKWebView 或 自定义对validateMenuItem:
和cut:
、copy:
和paste:
选择器的响应?
我对保留有用的 WKWebView 功能(为文本字段提供剪切、复制和粘贴)的解决方案特别感兴趣。
任何帮助将不胜感激。详情如下。
我的 Cocoa 包装器的目的有三个:
-
提供持久性
提供剪贴板集成
提供打印
我达到了 1,但在 2 和 3 上被阻止了;这个问题大约是2。
具体来说,我无法让框架调用我提供的validateMenuItem:
的任何实现——因此,我无法控制剪切、复制或粘贴菜单项何时可供用户选择。
我尝试了以下方法:
-
将我的 NSViewController 子类标记为接受第一响应者并在那里覆盖
validateMenyItem:
— 我的实现从未被调用
子类 WKWebView 并覆盖 validateMenuItem:
— 我的实现从未被调用过
继承 NSWindowController 并覆盖 validateMenuItem:
— 我的实现从未被调用过
现在,我打包的网络应用程序有一些文本字段。当我给出其中一个焦点并且合适时(文本在剪贴板上;我突出显示了一些文本),我的编辑菜单中的剪切、复制和粘贴选项会自动激活。他们甚至工作。 (我喜欢这个功能,并希望保留它。)因此,我怀疑正在发生的事情是,作为我当前的第一响应者,WKWebView 正在拦截响应者链中对validateMenuItem:
的任何调用。但我还需要能够根据包装好的网络应用中的其他状态激活菜单项,例如,当用户选择 SVG 图形时。
更新
我已经进行了额外的挖掘,试图找出解决我的问题的方法。在我的 WKWebView 子类中,我添加了一个自定义 @IBAction
。我在故事板上为其创建了一个菜单项,并将该菜单项连接到 FirstResponder,选择我的新操作。
我的 WKWebView 子类上的 validateMenuItem:
被调用。但仅适用于那个新选择器,而不适用于与我之前添加到我的 WKWebView 子类中的 @IBAction
关联的 copy:
选择器。
现在,我的copy:
方法,用@IBAction 标记并且具有Interface Builder(或现在所谓的任何东西)能够使用的方法签名,没有标记override
。当我尝试将其标记为override
时,出现错误。显然,WKWebView 没有提供copy:id
方法——即使它提供了复制功能并在选择文本字段中的文本时正确处理菜单项。
因此,WKWebView 似乎以某种方式自动(并且总是)处理对通常绑定到菜单的某些选择器的验证——特别是 cut:
、copy:
和 paste:
。此外,继承 WKWebView 并覆盖 validateMenuItem:
不足以中断/控制此默认行为。这看起来很奇怪。
但是通过阅读 *** 上关于 WKWebView 的其他帖子,我知道 WKWebView 实际上是一个相当复杂的功能。我特别感兴趣/担心的是 WKWebView 实际上在单独的进程中运行 Web 内容。因此,我想知道与该单独进程相关的某些东西是否负责菜单验证和处理cut:
、copy:
和paste:
——这是框架内部的东西,我无权访问。
我仍然希望有一个解决方案。希望上述更新将证明是有用的。
【问题讨论】:
【参考方案1】:奇怪的是,我也在考虑通过 WKWebView 将矢量设计工具移植到 Mac 并遇到同样的问题。看起来您实际上可以从inside JavaScript 控制剪切/复制/粘贴菜单项。如果您添加beforecopy
和beforecut
事件处理程序和preventDefault()
它们,则将启用剪切和复制菜单项。我似乎无法启用粘贴菜单项。我认为这可能是由于long-running bug in WebKit。您仍然可以在键盘上按 ⌘-V,粘贴仍然会发生,因为在这种情况下,WebKit 将跳过调用 beforepaste
并直接触发 paste
事件。我只是想不通启用粘贴菜单项。作为一种解决方法,我创建了一个“假”粘贴菜单选项,它不会转到普通的 paste:
选择器,而是转到我自己的 WKWebView 不会拦截的选择器。
【讨论】:
【参考方案2】:……5 年后……
请看我自己对另一个问题的回答:Manipulate paste content in WKWebView 这个解决方案涉及方法 Swizzling,可能也可以轻松解决您的问题。
【讨论】:
以上是关于WKWebView 的自定义剪切、复制和粘贴操作的主要内容,如果未能解决你的问题,请参考以下文章
Swift:WKWebView 中 UIRefreshControl 的自定义操作
WKWebview:从菜单中删除复制、查找、共享按钮并显示自定义