所以我只有一个标准的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?那传递的东西怎么样呢?
请指教!
谢谢!
答案 0 :(得分:4)
您是否检查过子视图中只有一个UIScrollView子类?在循环中的日志中查看。如果有多个,那么您只能使用您的代码选择最后一个。
如果只有一个UIScrollView子类,您可以尝试保存对其委托的引用,然后在您自己的委托方法中,在您完成业务后传递消息。
所以,在你的循环中,像
originalDelegate = s.delegate
然后对于委托方法,例如:
- (void) scrollViewDidScroll: (UIScrollView*) scrollView;
{
// do your stuff
[originalDelegate scrollViewDidScroll: scrollView];
}
你可能需要在调用之前检查originalDelegate是否响应选择器,即if([originalDelegate respondsToSelector:@selector(scrollViewDidScroll :))等。如果是我,我首先要实现定义的所有12个委托方法在UIScrollView委托协议中。
未对此进行测试,因此有兴趣知道是否可以使其正常工作。请注意,文档明确说明UIWebView“不应该是子类”