gpt4 book ai didi

objective-c - cocoa webView -elementAtPoint : (OS X) 异常崩溃

转载 作者:行者123 更新时间:2023-12-03 17:20:36 26 4
gpt4 key购买 nike

我有一个子类 webView覆盖 - hitTest:基本思想是,如果点击的是 body DOM 元素,我希望 webView 上的点击传递到 nextResponder。该方法如下所示

- (NSView *)hitTest:(NSPoint)aPoint
{
NSDictionary *dict = [self elementAtPoint:aPoint];
if([[dict valueForKey:@"WebElementDOMNode"] isKindOfClass:[DOMHTMLBodyElement class]])
{
return (NSView *)[self nextResponder];
}

return [super hitTest:aPoint];
}

运行时,它在 elementAtPoint 上崩溃与 EXC_BAD_ACCESS code=2

现在,事情变得更奇怪了。如果我在该行断点应用程序,并执行 po [self elementAtPoint:aPoint]在 LLDB 中,LLDB 会挂起,直到我执行 ^C。

更奇怪的是。如果我注释掉除最后一个 return 之外的所有内容,请在 return 语句上中断,然后运行 ​​po [self elementAtPoint:aPoint]在 LLDB 中——我得到了我所期望的,一本很好的字典告诉我此时关于 DOM 的所有信息。

什么可能导致此行为?

注意:这是在 OS X 上,而不是 iOS。

最佳答案

What could be causing this behavior?

只需看看 WebKit source code 中的 [WebView _elementAtWindowPoint:][WebView _frameViewAtWindowPoint:] 实现即可。 。不幸的是,他们使用 hitTest: 来确定 elementAtPoint:

就我而言,此解决方法似乎有效:

- (NSView *)hitTest:(NSPoint)point
{
if (m_hitTestEnabled)
{
[NSTimer scheduledTimerWithTimeInterval:0.
target:self
selector:@selector(hitTestDelayed:)
userInfo:@[ @(point.x), @(point.y) ]
repeats:NO];
}
return [super hitTest:point];
}

- (void)hitTestDelayed:(NSTimer *)timer
{
NSPoint point = NSMakePoint([[timer userInfo][0] floatValue], [[timer userInfo][1] floatValue]);

m_hitTestEnabled = false;
NSDictionary *dict = [self elementAtPoint:point];
m_hitTestEnabled = true;

if ([[dict valueForKey:@"WebElementDOMNode"] isKindOfClass:[DOMHTMLDivElement class]])
{
NSLog(@"divAtPoint: %@", dict);
}
}

m_hitTestEnabledinitWith... 方法中设置为 YES

为什么要使用计时器? WebView 上的此类操作仅允许在主线程中进行。因此,我们无法启动另一个线程来获取 elementAtPoint: 并在“main”hitTest: 中等待其完成。也许有人会想出更好的解决方案。

关于objective-c - cocoa webView -elementAtPoint : (OS X) 异常崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29991887/

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