如何从标准UIViewController中获取UIWebView的UIScrollView委托方法?

时间:2011-07-11 03:08:04

标签: iphone uiwebview uiscrollview subclass uiscrollviewdelegate

所以我只有一个标准的UIViewController,其中包含一个显示pdf的UIWebView。对于应用程序功能,我需要能够响应UIWebView的嵌套UIScrollView事件,如scrollViewWillBeginDragging,scrollViewDidScroll等。

我可以访问scrollView的唯一方法是(看起来像是一个hack)进入并通过子视图数组获取它:

for (id subview in webView.subviews){
    if ([[subview class] isSubclassOfClass: [UIScrollView class]])  {
        UIScrollView * s = (UIScrollView*)subview;
        s.delegate = self;
        s.tag = 1;
        scrollView = s;
    }
}

但这似乎引入了更多的问题而不是它的价值,因为我丢失了原生的UIScrollView,比如缩放。

总结一下我需要的东西:

将UIViewController类设置为UIWebView内部UIScrollView的委托的最佳方法是什么?我是否需要对自己的UIWebView进行子类化,以便处理来自它的事件以某种方式在UIWebView中构建,然后以某种方式将其传递给UIViewController?那传递的东西怎么样呢?

请指教!

谢谢!

1 个答案:

答案 0 :(得分:4)

  1. 您是否检查过子视图中只有一个UIScrollView子类?在循环中的日志中查看。如果有多个,那么您只能使用您的代码选择最后一个。

  2. 如果只有一个UIScrollView子类,您可以尝试保存对其委托的引用,然后在您自己的委托方法中,在您完成业务后传递消息。

  3. 所以,在你的循环中,像

    originalDelegate = s.delegate
    

    然后对于委托方法,例如:

    - (void) scrollViewDidScroll: (UIScrollView*) scrollView;
    {
         // do your stuff
    
         [originalDelegate scrollViewDidScroll: scrollView];
    }
    

    你可能需要在调用之前检查originalDelegate是否响应选择器,即if([originalDelegate respondsToSelector:@selector(scrollViewDidScroll :))等。如果是我,我首先要实现定义的所有12个委托方法在UIScrollView委托协议中。

    未对此进行测试,因此有兴趣知道是否可以使其正常工作。请注意,文档明确说明UIWebView“不应该是子类”