【问题标题】:UIWebView not calling UIScrollViewDelegate methodsUIWebView 不调用 UIScrollViewDelegate 方法
【发布时间】:2012-01-31 16:33:14
【问题描述】:

在我的 iphone 应用程序中,我将 uiwebview 的委托设置为文件所有者,但它没有调用 uiscrollviewdelegate 方法

我的代码是

- (void)webViewDidStartLoad:(UIWebView *)webView{
    NSLog(@"webViewDidStartLoad  ");
}

- (void)webViewDidFinishLoad:(UIWebView *)webView{
     NSLog(@"webViewDidFinishLoad  ");
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{

     NSLog(@"scrollViewDidEndDecelerating  ");
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

    NSLog(@"scrollViewDidScroll  ");
}

但我得到了

webViewDidStartLoad
webViewDidFinishLoad

控制台中的这些消息。

我怎么了

提前致谢

【问题讨论】:

标签: iphone objective-c ios uiwebview uiscrollview


【解决方案1】:

UIWebView 有它自己的 UIScrollView。也许你可以试试这样self.webView.scrollView.delegate = self;

【讨论】:

    【解决方案2】:

    对于那些关注 SWIFT 3 解决方案的人:

    设置 UIScrollViewDelegate 然后这里是一个例子:

    var noticias: UIWebView!
    noticias.scrollView.delegate = self
    

    【讨论】:

      【解决方案3】:

      UIWebView 的scrollView 实际上从iOS2 开始就有一个可写的delegate 属性。 它非常适合我使用它。

      【讨论】:

        【解决方案4】:

        UIWebViewdelegate 属性只允许您为UIWebViewDelegate 协议设置委托。 (查看here 以获取UIWebView 参考。)

        UIWebView 本身就是一个UIScrollViewDelegate,因为它接收来自它所包含的UIScrollView 的委托调用。不幸的是,您没有对该 UIScrollView 的 API 访问权限,因此您无法更改其委托;因此,它仍然硬编码为UIWebView 本身。

        现在,您可以通过多种方式尝试获取这些委托消息。

        获得UIScrollViewDelegate 调用的一种方法是继承UIWebView,如果可行的话。在任何情况下,您都应该非常小心,因为根据您的操作,您可能会破坏UIWebView 的完整性,并且某些功能可能会停止工作(可能在未来的某些 SDK 版本中)。此外,Apple 不鼓励这样做,尽管它不会让您的应用被拒绝(据许多人报告说这样做并且在 App Store 批准方面没有问题)。

        另一种方法是遍历UIWebViewsubviews,直到找到UIScrollView 对象,然后更改其委托。

        UIScrollView* scrollView = nil;
        for (UIView* subview in [webView subviews]) {
           if ([subview isKindOfClass:[UIScrollView class]]) {  
              scrollView = (UIScrollView*)subview;
              scrollView.delegate = <YOUR_DELEGATE_HERE>;
              break;
           }
        }
        

        我不确定这是否可靠或可能会破坏任何东西,因为UIWebView 与其UIScrollView 子级之间的耦合非常紧密,并且没有在任何地方描述,但您可以尝试一下。总而言之,我认为这并不比继承 UIWebView 好多少。

        最后,第三种方法是定义自己的UIWindow 类型。这将允许您覆盖一些关键方法(sendEventhitTest:event:),以便您可以在视图级别调度触摸之前拦截触摸。这将使您有机会处理它们,并在需要时阻止它们达到最初的目标。

        这是最简洁的解决方案,虽然它需要更多工作,并且需要您定义一个自定义 UIWindow,您可以在其中执行所有触摸识别/调度。

        here 提供了描述如何覆盖 sendEvent 的教程。

        【讨论】:

        • 在他们的 UIWebview 参考资料中,Apple 说 The UIWebView class should not be subclassed.
        • 谢谢,@tipycalFlow。无论如何,必须考虑到 OP 正在尝试做一些超出 Apple 允许做的事情;因此,在这种特定情况下,可能忽略 Apple 关于 UIWebView 覆盖的建议。当然,不能保证事情会正常运行或将来不会中断。
        • 确实,是的......另外,这不起作用[webView subviews]This link 谈论如何正确地继承 UIWebview
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-24
        • 2011-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多