【问题标题】:Why does a UIWebView instance not call scrollViewDidScroll?为什么 UIWebView 实例不调用 scrollViewDidScroll?
【发布时间】:2012-08-23 14:21:16
【问题描述】:

iOS 文档说,UIWebView 类符合 UIScrollViewDelegate。但是 UIWebView 实例不会调用其控制器的scrollViewDidScroll 方法。委托正好由

设置
[webView setDelegate:self];

并且webViewDidFinishLoad 被成功调用。控制器实现了两个委托,UIWebViewDelegate 和 UIScrollViewDelegate,如下所示:

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

浏览 SO 导致 category solution:

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

该类别方法的作用基本相同:调用委托的 scrollViewDidScroll 方法。那么为什么第一种方法不起作用呢?

【问题讨论】:

  • 你为scrollView设置代理了吗? webView.scrollView.delegate = self ?
  • 不,我没有。是的,这行得通!
  • 那么,UIWebView 实例默认将其scrollViews 的委托设置为该实例?看起来......否则类别方法将不起作用。
  • 要工作,此代码必须在类别 scrollView 委托内设置为 webview,然后在 UIWebView(CustomScroll) scrollViewDidScroll 内将此消息通过 self.delegate(这是 UIWebView 的委托)发送到响应的对象到 webView 委托。所以是的,这段代码可以工作。

标签: iphone ios uiwebview


【解决方案1】:

我的猜测是你只为 UIWebView 设置了委托。 尝试设置 scrollView 的委托。

webView.scrollView.delegate = self

应该没问题。

【讨论】:

  • 考虑在子 scrollViewcontentOffset 属性上使用 KVO。修改 UIScrollView 的委托属性不一定是安全的,因为 UIWebView 可以在内部使用它。
【解决方案2】:

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

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

在iOS7等页面上尝试输入数据时会失去焦点

您需要为 UIWevView 实现自定义类并覆盖 scrollViewDidScroll:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多