gpt4 book ai didi

objective-c - 使用 WKWebView 接收 NSDraggingDestination 消息

转载 作者:搜寻专家 更新时间:2023-10-30 20:05:23 24 4
gpt4 key购买 nike

我正在将一个使用 WebView 的 OS X 应用程序移植到使用 WKWebView,这是 OS X Yosemite 中引入的新的“现代 WebKit API”。我以前的 WebView 子类支持通过首先调用 [self registerForDraggedTypes:@[NSFilenamesPboardType]] 将文件拖放到它上面然后简单地实现 - (BOOL)performDragOperation:(id < NSDraggingInfo >)sender .

这不适用于新的 WKWebView,因为 performDragOperation永远不会被调用,也不会调用任何 NSDraggingDestination我尝试过的协议(protocol)方法。

我还尝试让父 NSView 实现该协议(protocol),但我仍然没有收到消息。从层次结构中删除 WKWebView 会使父 NSView 接收这些消息。

我还尝试实现 WKNavigationDelegate 协议(protocol)来防止 WKWebView 的默认放置行为发生,这也没有改变任何事情。

编辑:经过进一步检查(由 Scott Kyle/@appden 在推特上建议),私有(private)类(class) WKViewimplements the NSDraggingDestination protocol是 WKWebView 的 subview 。我的代码可能会尝试在 WKView 看到拖动通知并对其采取行动之前获取它们。

最佳答案

我找到的唯一解决方案,感谢 Scott Kyle , 是用我自己的实现替换 WKView 上定义的 performDragOperation: 方法,使用来自Objective-C 运行时。希望在未来,WKUIDelegate 协议(protocol)将得到扩展,以支持自定义 Hook 到由 WKWebView 私下实现的拖放协议(protocol)。

下面的示例展示了我们如何将嵌套 View 的 performDragOperation: 的实现与我们自己的 WKWebView 子类交换:

    // Override the performDragOperation: method implemented on WKView so that we may get drop notification.
var originalMethod = class_getInstanceMethod(object_getClass(subviews[0]), "performDragOperation:")
var overridingMethod = class_getInstanceMethod(object_getClass(self), "performDragOperation:")
method_exchangeImplementations(originalMethod, overridingMethod)

然后是我们委托(delegate)给 dropDelegate 对象的实现。

override func performDragOperation(sender: NSDraggingInfo) -> Bool {
let myWebView = superview as MyWebView
if let dropDelegate = myWebView.dropDelegate {
return dropDelegate.webView(myWebView, performDragOperation: sender)
}
return false
}

关于objective-c - 使用 WKWebView 接收 NSDraggingDestination 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25096910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com