为什么UIWebView实例不调用scrollViewDidScroll方法?

12
iOS文档表示,UIWebView类符合UIScrollViewDelegate协议。但是,UIWebView实例不会调用其控制器的scrollViewDidScroll方法。委托只需正确设置即可。
[webView setDelegate:self];

webViewDidFinishLoad 被成功调用。控制器实现了两个代理,UIWebViewDelegate 和 UIScrollViewDelegate,像这样:

@interface WebviewController : UIViewController<UIWebViewDelegate, UIScrollViewDelegate>{
    UIWebView *webView;
}

浏览SO会导致分类解决方案
@implementation UIWebView(CustomScroll)
- (void) scrollViewDidScroll:(UIScrollView *)scrollView{
    [self.delegate scrollViewDidScroll: scrollView];
}
@end

那种类别的方法基本上是一样的:调用代理的scrollViewDidScroll方法。那么为什么第一种方法不起作用呢?


2
你有为scrollView设置代理吗?webView.scrollView.delegate = self - pawelropa
不,我没有。是的,那个可行! - alex
那么,一个 UIWebView 实例默认将其 scrollViews 的委托设置为该实例? 看起来是这样的...否则类别方法就行不通了。 - alex
为了使这段代码工作,必须将其设置在类别scrolView的委托中,然后在UIWebView(CustomScroll)scrollViewDidScroll中,通过self.delegate(即UIWebView的委托)向响应webView委托的对象发送此消息。所以是的,这段代码可以工作。 - pawelropa
2个回答

29

我猜你只为UIWebView设置了代理。 尝试设置scrollView的代理。

webView.scrollView.delegate = self

应该没问题。


1
考虑在子scrollViewcontentOffset属性上使用KVO。由于UIWebView可能在内部使用它,因此修改UIScrollView的委托属性不一定安全。 - lipka

0

这不是正确的。如果你使用:

@implementation UIWebView(CustomScroll)
- (void) scrollViewDidScroll:(UIScrollView *)scrollView{
    [self.delegate scrollViewDidScroll: scrollView];
}
@end

在iOS7及以上版本中,当尝试在页面上输入数据时,您会失去焦点。

您需要实现自定义类来处理UIWebView,并覆盖scrollViewDidScroll:方法。

- (void) scrollViewDidScroll:(UIScrollView *)scrollView{
[super scrollViewDidScroll:scrollView];
[((id<UIScrollViewDelegate>)self.delegate) scrollViewDidScroll:scrollView];}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接