【问题标题】:add implementation UIWebView(CustomScroll)添加实现 UIWebView(CustomScroll)
【发布时间】:2013-03-22 00:03:49
【问题描述】:

我正在尝试将this 添加到我的代码中

@implementation UIWebView(CustomScroll)
- (void) scrollViewDidScroll:(UIScrollView *)scrollView{
    [self.delegate scrollViewDidScroll: scrollView];
}
@end

但是得到“选择器'scrollViewDidScroll:'没有已知的实例方法” 我在这里错过了什么?

【问题讨论】:

    标签: ios objective-c cocoa uiwebview


    【解决方案1】:

    UIWebViewDelegate 协议没有声明方法scrollViewDidScroll:。因此,这就是您收到错误访问错误的原因。

    我建议您将UIWebView 子类化,而不是尝试在其上创建类别(是的,文档建议不要子类化...只是不要覆盖它拥有的任何方法,而且它是安全的)。

    在您的子类中,您可以创建一个新协议,也可以简单地覆盖delegate 属性以同样要求它符合`UIScrollViewDelegate(后者如下所示):

    示例:

    // MyWebView.h
    #import <UIKit/UIKit.h>
    
    @interface MyWebView : UIWebView
    @property (nonatomic, assign) id<UIWebViewDelegate, UIScrollViewDelegate> delegate;
    @end
    
    
    // MyWebView.m
    #import "MyWebView.h"
    
    @implementation MyWebView
    
    -(void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        /* As scrollViewDidScroll: is optional, you should check if the super class
           responds to this method (it doesn't appear to now, but this may change in future) */
    
        if ([[self superclass] instancesRespondToSelector:@selector(scrollViewDidScroll:)])
        {
            [super scrollViewDidScroll:scrollView];
        }
    
        /* Likewise, you should check if your own delegate responds to this selector */
    
        if ([self.delegate respondsToSelector:@selector(scrollViewDidScroll:)])
        {
            [self.delegate scrollViewDidScroll:scrollView];
        }
    }
    
    @end
    

    【讨论】:

    • 请参阅编辑后的答案以进一步澄清。如果您还需要帮助,请告诉我。 :D
    • 感谢您的帮助。当我尝试滚动子类UIWebView 时,我得到-[MyWebView scrollViewDidScroll:]: unrecognized selector sent to instance 0x819cf50
    • 由于某种原因[super scrollViewDidScroll:scrollView]; 失败了?
    • 因为就编译器所知,UIWebView 不是UIScrollViewDelegate。您应该可以使用 @interface UIWebView(Foo)&lt;UIScrollViewDelegate&gt; @end 解决此问题,但这有点不确定(不过,只要您从不自己调用它就可以了)。
    • @tc,实际上编译器确实知道...参见UIWebView.h,它显示了@interface UIWebView : UIView &lt;NSCoding, UIScrollViewDelegate&gt;。因此,无需声明您的子类符合UIScrollViewDelegate 两次。
    猜你喜欢
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多