【问题标题】:How can I get a UIWebView's UIScrollView delegate methods called from within a standard UIViewController?如何获取从标准 UIViewController 中调用的 UIWebView 的 UIScrollView 委托方法?
【发布时间】:2011-10-02 11:45:53
【问题描述】:

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

我可以访问 scrollView 的唯一方法是(这似乎是一个 hack)进入并通过 subviews 数组获取它:

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?无论如何,那个传递的东西是如何工作的?

请指教!

谢谢!

【问题讨论】:

    标签: iphone uiwebview uiscrollview subclass uiscrollviewdelegate


    【解决方案1】:
    1. 您是否检查过子视图中只有一个 UIScrollView 子类?在您的循环中插入日志以查看。如果有多个,那么您将只使用您的代码选择最后一个。

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

    所以,在你的循环中,像

    originalDelegate = s.delegate
    

    然后对于委托方法,类似:

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

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

    未对此进行测试,因此有兴趣知道它是否可以工作。请注意,文档明确表示 UIWebView“不应被子类化”

    【讨论】:

    • 感谢您的回答!我试过了,它成功了一半。我确信当我实现所有 12 个委托方法时,我所面临的错误可以得到解决。也许是一个愚蠢的问题,但你怎么知道所有方法都返回什么?我的意思是特别是那些你不需要明确覆盖的?我想全部实现它们,但是发现文档中缺少实际的实现说明(例如在方法签名实现之后)。谢谢!
    • 两个 UIScrollViewDelegate 方法返回一个值。对于这些情况,只需返回他们返回的内容,例如- (UIScrollView*) viewForZoomingInScrollView: (UIScrollView*) scrollView { // 你的东西返回 [originalDelegate viewForZoomingInScrollView: originalDelegate]; } 这就是你要问的吗??
    • 是的,所以你提到我应该实现所有 12 个委托方法,但是如果只有两个返回任何东西,那么我自己实现所有这些有什么好处?我认为那是我不明白的......:)
    • 等等,我想它现在正在点击!所以在每个委托实现中,我只是将方法调用传递给我存储原始委托的委托变量?所以在每种方法中,我都会做 [originalDelegate whateverTheCurrentMethodIs];只是为了确保它被传递给原来的代表?
    • 是的 - 你明白了......你可能没有实现它们,但原始代表可以。如果您要保持原始行为,您需要给原始委托一个机会来响应滚动视图发送给它的信息。假设您出于您的目的而忽略 viewDidScroll。如果您不传递消息,则 originalDelegate 将无法执行由于移动而可能需要调整视图的任何工作。我不知道 originalDelegate 会做什么。当你完成工作时,你会开始得到一个想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多