0

これをコードに追加しようとしています

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

しかし、「セレクター 'scrollViewDidScroll:' の既知のインスタンス メソッドはありません:」というメッセージが表示されます。

4

1 に答える 1

3

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
于 2013-03-22T00:05:56.930 に答える