为什么我不能覆盖WebView的'copy:'方法?

时间:2014-08-14 19:00:17

标签: objective-c macos cocoa webview

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

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

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

可悲的是,我的重新定义的方法永远不会被调用。为什么呢?

1 个答案:

答案 0 :(得分:0)

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

在这种情况下,documentView(WebView-> -WebFrame-> WebFrameView-> documentView)是第一个响应者,它的实现是(检查宏[here] [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]