UIWebView不调用UIScrollViewDelegate方法
在我的iphone应用程序,我设置我的uiwebview委托给文件的所有者,但它不是调用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
这些消息在控制台中。
有什么不对吗
提前致谢
UIWebView
的delegate
属性只允许你设置UIWebViewDelegate
协议的委托。 ( 在这里寻找UIWebView
参考。)
UIWebView
本身就是一个UIScrollViewDelegate
,它从它所包含的UIScrollView
接收委托调用。 不幸的是,你没有这个UIScrollView
API访问权限,所以你不能改变它的委托。 因此,它仍然是硬编码到UIWebView
本身。
现在,有几种方法可以尝试获取这些委托消息。
一个方法让你得到UIScrollViewDelegate
调用是子类化UIWebView
,如果有效的话。 无论如何,你应该非常小心,因为根据你做什么,你可能会破坏UIWebView
完整性,一些function可能会停止工作(可能还有一些未来的SDK版本)。 此外,苹果公司不鼓励这样做,尽pipe它不会让你的应用程序被拒绝(许多人已经报道了这一点,并没有问题的应用程序商店批准)。
另一种方法是遍历UIWebView
的subviews
,直到findUIScrollView
对象,然后更改其委托。
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
之间的耦合是非常紧密的,没有描述任何地方,但你可以尝试一下。 总而言之,我不认为这比UIWebView
子类更好。
最后,第三种方法是定义你自己的UIWindow
types。 这将允许您重写几个关键方法( sendEvent
或hitTest:event:
sendEvent
,以便可以在视图级别分派sendEvent
之前拦截它们。 这将给你一个机会来处理它们,并在必要时阻止它们达到原来的目标。
这是最干净的解决scheme,虽然它是更多的工作,它会要求你定义一个自定义的UIWindow
,你做所有的触摸识别/调度。
描述如何覆盖sendEvent
教程可以在这里find 。
对于那些正在关注SWIFT 3解决scheme的人员:
设置UIScrollViewDelegate然后这里是一个例子:
var noticias: UIWebView! noticias.scrollView.delegate = self
UIWebView有它自己的UIScrollView.Maybe你可以尝试像这样self.webView.scrollView.delegate = self;
UIWebView的scrollView实际上有一个可写的委托属性,因为iOS2。 这对我来说是完美的使用它。