2012-04-08 7 views
2

の他のすべてのメソッドなので、そうここにある、私はこの問題のために、すべての研究をしましたが、既存のソリューションのどれも私の問題に対処するように見えるていない場合:問題scrollViewDidScrollを上書きではなく、オーケーUIScrollViewDelegate

  • 私は、私はすでにこのことからコードを実行しようとしている
  • 、私は(すべてのメソッドではなく)UIScrollViewDelegateからscrollViewDidScrollメソッドをオーバーライドしたい

をUIScrollViewのを拡張するカスタムクラスを持っている(とのUIViewが含まれています)問題:How to subclass UIScrollView and make the delegate property privateしかし何らかの理由で、何もしません(オーバーライドされたカスタムメソッドが呼び出されることはありません)。私はまた、あなたが(iPhone: Do I need to implement all methods for UIScrollViewDelegate (or any delegate)あたりなど)プロトコルを実装するカスタム委譲クラスを作成する場合は、UIScrollViewDelegateからのすべてのメソッドを実装する必要がないことを知っている - しかし、私はこれを行うとき:

MyScrollViewDelegate.h

@interface MyScrollViewDelegate: NSObject <UIScrollViewDelegate> 

-(void)scrollViewDidScroll:(UIScrollView *)scrollView; 

@end 

UIScrollを拡張サブクラスにおいてMyScrollViewDelegate.m

@implementation MyScrollViewDelegate 

-(void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    NSLog(@"Custom scrollViewDidScroll called."); 
    // -- some more custom code here -- 
    // ... 
} 

@end 

ビュー

// this scrollview is initiated by the NIB 
- (void)awakeFromNib 
{ 
    ... 
    [self setDelegate:[[MyScrollViewDelegate alloc] init]]; 
} 

しかし、それはコンパイルし、実行し、私はスクロール可能なビューをスクロールしようとすると、それはEXC_BAD_ACCESSとデバッグコンソールで不可解「(lldb)」というメッセージでクラッシュしながら。

私はここで何をすべきか分かりません。

答えて

2

私はHow to subclass UIScrollView and make the delegate property privateの実装があります。私の推測では、なぜあなたのコードは何もしませんでした。実際にスクロールビューのcontentSizeをビューのサイズよりも大きいものに設定したかどうかを再確認してください。小さい場合はスクロールせず、バウンスするだけで、scrollViewDidScrollは呼び出されません。

コードの場合、実際には1行に2つの問題があります。まず、UIScrollViewのデリゲートプロパティはassign型です。つまり、デリゲートクラスが他の場所に保持されていない場合、それはしばらくの間消えてEXC_BAD_ACCESSになります。次に、[[MyScrollViewDelegate alloc] init]をデリゲートに割り当て、そのオブジェクトを解放しないことによって、参照カウントが1であり、決して解放されない孤立オブジェクトを作成します。私の推測では、システムが実行時に孤立したオブジェクトを認識し、それをクリーンアップした後、デリゲートにメッセージが送信されたときにEXC_BAD_ACCESSが取得されます。

あなたが別のデリゲートを使用してバージョンを使用する場合は、次のように私はそれを修正します:

@interface MyScrollView: UIScrollView 
{ 
    id<NSObject, MyScrollViewDelegate> dlgt; 
    ... 
} 
... 
@end 

@implementation MyScrollView 
- (void)awakeFromNib 
{ 
    ... 
    dlgt = [[MyScrollViewDelegate alloc] init]; 
    [self setDelegate:dlgt]; 
} 

-dealloc 
{ 
    [dlgt release]; 
    [super dealloc]; 
} 
@end 

それでも、ビューの境界よりも大きな何かにcontentSizeを設定することを忘れないでください。それ以外の場合、スクロールしたりデリゲートを呼び出すことはありません。

+0

ありがとうございました!私はこれを試してみましょう... –

+0

私はcontentSize全体のUIScrollViewオブジェクトのビューの境界(少なくとも垂直に - 水平に私はサイズが同じだと思う)よりも大きく設定しました。 –

+0

驚くばかり!これは動作します!ちょうど2つのコメント: –

関連する問題