为啥我不能覆盖 WebView 'copy:' 方法?

Posted

技术标签:

【中文标题】为啥我不能覆盖 WebView \'copy:\' 方法?【英文标题】:Why I can not override WebView 'copy:' method?为什么我不能覆盖 WebView 'copy:' 方法? 【发布时间】:2014-08-14 19:00:16 【问题描述】:

我想重写一些 WebView 的编辑操作方法。于是,我创建了 MyWebView,它是一个 WebView 的子类,并重新定义了以下方法

- (void)copy:(id)sender;
- (void)cut:(id)sender;

这些方法列在公共 WebView API 中,即“复制:” https://developer.apple.com/library/mac/documentation/Cocoa/Reference/WebKit/Classes/WebView_Class/Reference/Reference.html#//apple_ref/occ/instm/WebView/copy:

遗憾的是,我重新定义的方法从未被调用过。为什么?

【问题讨论】:

【参考方案1】:

这是因为第一响应者是您覆盖的其他类。但是,不能使用您想要子类化的类(将其链接到 WebView)。

在这种情况下,documentView (WebView->-WebFrame->WebFrameView->documentView) 是第一响应者,它的实现是(检查宏 [此处][1]):

#define FORWARD(name) \
    - (void)name:(id)sender  [self _performResponderOperation:_cmd with:sender]; 

这段代码调用私有方法,所以这是一个死胡同。

我认为您应该尝试注入 javascript 来检测复制并调用负责任的 Obj-C 方法。第二种解决方案可能是覆盖 NSApplication 并检查所有发送的事件并获取您需要的事件(未经验证 + 性能下降)。

[1][http://www.opensource.apple.com/source/WebKit/WebKit-7537.74.9/mac/WebView/WebView.mm]

【讨论】:

以上是关于为啥我不能覆盖 WebView 'copy:' 方法?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的js不能在swift的webview里运行

为啥我不能使用 Webview 加载我的本地页面

为啥我不能用 `copy()` 复制切片?

为啥 Go Back 不能使用此源代码在 webview android 应用程序中工作?

为啥我不能在 C++0x 中对 std::shared_ptr 的向量执行 std::copy?

为啥我不能删除或删除 iPhone / iPad Duplicate Enterprise App Icon Copy?