gpt4 book ai didi

iphone - UIWebView 不调用 UIScrollViewDelegate 方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:55:09 26 4
gpt4 key购买 nike

在我的 iPhone 应用程序中,我将 uiwebview 的委托(delegate)设置为文件所有者,但它没有调用 uiscrollviewdelegate 方法

我的代码是

- (void)webViewDidStartLoad:(UIWebView *)webView{
NSLog(@"webViewDidStartLoad ");
}

- (void)webViewDidFinishLoad:(UIWebView *)webView{
NSLog(@"webViewDidFinishLoad ");
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{

NSLog(@"scrollViewDidEndDecelerating ");
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

NSLog(@"scrollViewDidScroll ");
}

但是我得到了

webViewDidStartLoad
webViewDidFinishLoad

控制台中的这些消息。

我怎么了

提前致谢

最佳答案

UIWebViewdelegate 属性只允许您为UIWebViewDelegate 协议(protocol)设置委托(delegate)。 (查找 here 以获取 UIWebView 引用。)

UIWebView 本身就是一个 UIScrollViewDelegate,因为它从它包含的 UIScrollView 接收委托(delegate)调用。不幸的是,您没有对该 UIScrollView 的 API 访问权限,因此您无法更改其委托(delegate);因此,它仍然硬编码到 UIWebView 本身。

现在,您可以通过多种方式尝试获取这些委托(delegate)消息。

获得 UIScrollViewDelegate 调用的一种方法是子类化 UIWebView,如果可行的话。在任何情况下,您都应该非常小心,因为根据您的操作,您可能会破坏 UIWebView 的完整性,并且某些功能可能会停止工作(可能会在未来的 SDK 版本中出现)。此外,Apple 不鼓励这样做,尽管它不会让您的应用程序被拒绝(据许多人报告说这样做并且在 App Store 批准方面没有问题)。

另一种方法是遍历 UIWebViewsubviews,直到找到 UIScrollView 对象,然后更改其委托(delegate)。

UIScrollView* scrollView = nil;
for (UIView* subview in [webView subviews]) {
if ([subview isKindOfClass:[UIScrollView class]]) {
scrollView = (UIScrollView*)subview;
scrollView.delegate = <YOUR_DELEGATE_HERE>;
break;
}
}

我不确定这是否可靠或可能会破坏任何东西,因为 UIWebView 和它的 UIScrollView 子级之间的耦合非常紧密并且没有在任何地方描述,但你可以试试。总而言之,我不认为这比子类化 UIWebView 好多少。

最后,第三种方法是定义您自己的 UIWindow 类型。这将允许您覆盖一些关键方法(sendEventhitTest:event:),以便您可以在触摸发送之前拦截它们在 View 级别。这将使您有机会处理它们,并在需要时阻止它们到达最初的目标。

这是最干净的解决方案,尽管它需要更多工作并且需要您定义一个自定义 UIWindow,您可以在其中进行所有触摸识别/调度。

描述如何覆盖 sendEvent 的教程可用 here .

关于iphone - UIWebView 不调用 UIScrollViewDelegate 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8698664/

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