2

さて、私はこの問題についてすべての調査を行いましたが、既存の解決策のどれも私の問題に対処していないようですので、ここにあります:

  • UIScrollViewを拡張する(そしてUIViewを含む)カスタムクラスがあります
  • UIScrollViewDelegateのscrollViewDidScrollメソッドをオーバーライドしたい(すべてのメソッドではない)

私はすでにこの問題のコードを実装しようとしました:UIScrollViewをサブクラス化し、デリゲートプロパティをプライベートにする方法ですが、何らかの理由で何もしません(オーバーライドされたカスタムメソッドは呼び出されません)。また、プロトコルを実装するカスタムデリゲートクラスを作成する場合、UIScrollViewDelegateのすべてのメソッドを実装する必要はないことも知っています(iPhoneの場合:UIScrollViewDelegate(または任意のデリゲート)のすべてのメソッドを実装する必要がありますか)-しかし、私はこれをします:

MyScrollViewDelegate.h

@interface MyScrollViewDelegate: NSObject <UIScrollViewDelegate>

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

@end

MyScrollViewDelegate.m

@implementation MyScrollViewDelegate

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

@end

UIScrollViewを拡張するサブクラス内

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

しかし、コンパイルして実行しているときに、スクロール可能なビューをスクロールしようとすると、デバッグコンソールにEXC_BAD_ACCESSと不可解な「(lldb)」メッセージが表示されてクラッシュします。

だから私はここで何をすべきか途方に暮れています。

4

1 に答える 1

2

UIScrollViewをサブクラス化し、機能するデリゲートプロパティをプライベートにする方法の実装があります。コードが何もしなかった理由を推測します。実際にスクロールビューの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をビューの境界よりも大きいものに設定することを忘れないでください。それ以外の場合、スクロールやデリゲート呼び出しはありません。

于 2012-04-10T10:51:51.680 に答える