macos - WKWebView 的自定义剪切、复制和粘贴操作

标签 macos cocoa wkwebview

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

我怎样才能:

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

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

    任何帮助将非常感激。详情如下。

    我的 Cocoa wrapper 的目的有三个:
  • 提供持久性
  • 提供剪贴板集成
  • 提供打印

  • 我已经达到了 1,但是在 2 和 3 上被阻止了;这个问题是关于2。

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

    我尝试了以下方法:
  • 将我的 NSViewController 子类标记为接受第一响应者并覆盖 validateMenyItem:那里——我的实现从未被称为
  • 子类化 WKWebView 并覆盖 validateMenuItem: — 我的实现从未被调用
  • 子类 NSWindowController 并覆盖 validateMenuItem: — 我的实现从未被调用

  • 现在,我打包的 Web 应用程序有一些文本字段。当我给出其中一个焦点并且在合适的时候(文本在剪贴板上;我突出显示一些文本),我的“编辑”菜单中的“剪切”、“复制”和“粘贴”选项会自动激活。他们甚至工作。 (我喜欢这个功能,并希望保留它。)因此,我怀疑正在发生的事情是 WKWebView 作为我当前的第一响应者,正在拦截对 validateMenuItem: 的任何调用。沿着响应者链。但我还需要能够根据我包装的网络应用程序中的其他状态激活菜单项 - 例如,当用户选择一个 SVG 图形时。

    更新

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

    还有我的 validateMenuItem:在我的 WKWebView 子类上被调用。但仅适用于那个新选择器,不适用于 copy:@IBAction 关联的选择器我之前添加到我的 WKWebView 子类中。

    现在,我的 copy:方法,用@IBAction 标记并具有接口(interface)生成器(或现在被称为的任何东西)能够使用的东西的方法签名,未标记 override .当我试图标记它时 override ,我有一个错误。显然,WKWebView 不提供 copy:id方法——即使它提供了复制功能并正确处理菜单项,当文本字段中的文本被选中时。

    所以看起来,不知何故,WKWebView 自动(并且总是)处理某些通常绑定(bind)到菜单的选择器的验证——特别是,cut: , copy:paste: .此外,子类化 WKWebView 并覆盖 validateMenuItem:不足以中断/控制此默认行为。这看起来很奇怪。

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

    我仍然希望有一个解决方案。希望上述更新将被证明是有用的。

    最佳答案

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

    关于macos - WKWebView 的自定义剪切、复制和粘贴操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29376510/

    相关文章:

    android - echo $ANDROID_HOME 在 Mac 中返回空白

    swift - 重用 webviews UICollectionView

    ios - 在展开可选值 WKWebView 获取参数时意外发现 nil

    python - 如何将 UTF-16 编码字符串转换为适合 Mac OS X 文件名的编码?

    mysql - 从 macOS 卸载 MySQL

    php - 如何在 Mac 10.6.7 上安装 pecl 或 pecl 扩展?

    swift - 当没有打开窗口时,Macos 应用程序正在关闭

    cocoa - 基于文档的应用程序,预初始化窗口(输入序列号、购买、试用)

    objective-c - Launchpad 使用哪个控件?

    javascript - 从 objective-c 到Javascript WKWebkit AVPlayer通知游戏结束