4

所以我只需要一个带有UIWebView的标准UIViewController来显示pdf。对于应用程序的功能,我需要能够向一个UIWebView的嵌套UIScrollView的事件,如scrollViewWillBeginDragging,scrollViewDidScroll等应对如何从标准UIViewController中调用UIWebView的UIScrollView委托方法?

我可以访问了滚动的唯一方法是(这似乎是一个黑客)去并通过子视图数组获得它:

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类的的UIScrollView的委托的UIWebView内的最佳方式?有没有什么我需要做的是继承我自己的UIWebView,以便它以某种方式处理UIWebView中构建的事件,然后以某种方式将它传递给UIViewController?无论如何,这种过渡的事情如何工作?

请指教!

谢谢!

回答

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

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

所以,在你的循环,像

originalDelegate = s.delegate 

然后在委托方法,是这样的:

- (void) scrollViewDidScroll: (UIScrollView*) scrollView; 
{ 
    // do your stuff 

    [originalDelegate scrollViewDidScroll: scrollView]; 
} 

您可能需要检查originalDelegate是否响应选择在调用它之前,即如果([originalDelegate respondsToSelector:@selector(scrollViewDidScroll :))等。如果是我,我会开始实施所有12个委托方法定义在UIScrollView代尔加te协议。

没有测试过这个,所以有兴趣知道它是否可以工作。请注意,文档明确指出,UIWebView“不应该被分类”

+0

感谢您的回答!我试了一下,它中途工作。我确信当我实现全部12个委托方法时,我面临的错误可以被消除。也许一个愚蠢的问题,但你怎么知道所有的方法返回?我的意思是特别针对那些你并未明确需要重写的人。我想要全部实现它们,但发现实际实现说明中缺少文档(如在方法签名实现之后)。谢谢! –

+0

两个UIScrollViewDelegate方法返回一个值。对于这些情况,只要返回他们返回的内容,例如 - (UIScrollView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {//做你的东西返回[originalDelegate viewForZoomingInScrollView:originalDelegate]; }你在问什么? – Obliquely

+0

是的,你提到我应该实现所有12个委托方法,但是如果只有两个方法返回任何东西,那么它自己实现所有方法有什么好处?我想这就是我没有得到的...... :) –

相关问题