2013年9月アーカイブ

一覧を更新したタイミングで直前の選択状態に戻したいなど、UICollectionView更新前後のタイミングを知りたい事が多々あるかと思います。
しかし残念な事にこのタイミングのコールバックメソッドは用意されていません。
今回はUICollectionView更新前後でコールバックされるメソッドを自前で追加する方法をご紹介します。

まずコールバックメソッドを追加する為にUITableViewを継承したクラス「UICollectionViewEx」を作成します。
また、UICollectionViewEx用のプロトコルを宣言します。

@class UICollectionViewEx;


@protocol UICollectionViewExDelegate <NSObject, UICollectionViewDelegate>


@optional

- (void)willReloadDataByCollectionView:(UICollectionViewEx*)collectionView;

- (void)didReloadDataByCollectionView:(UICollectionViewEx*)collectionView;


@end


// 拡張機能を持たせたUICollectionView

@interface UICollectionViewEx : UICollectionView


@property (nonatomic, assign) id<UICollectionViewExDelegate> delegate;


@end



UICollectionViewExを使用する際、UICollectionViewのdelegate設定のみで使用できるようにするため、UICollectionViewExDelegateはUIControllViewDelegateを継承します。

実装は以下の通りです。

@implementation UICollectionViewEx


@dynamic delegate;


- (id)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self) {

        // Initialization code

    }

    return self;

}


- (void)reloadData

{

if ([self.delegate respondsToSelector:@selector(willReloadDataByCollectionView:)]) {

[self.delegate willReloadDataByCollectionView:self];

}

[super reloadData];

if ([self.delegate respondsToSelector:@selector(didReloadDataByCollectionView:)]) {

[self.delegate didReloadDataByCollectionView:self];

}

}


@end


reloadDataメソッドをオーバーライドし、更新前後のタイミングでコールバックする処理を追加しています。
delegateを@dynamic宣言のみ行なう事により、スーパークラスのdelegateを流用します。

UICollectionViewExの使い方はUICollectionViewと何も変わりません。
必用な時に、追加したコールバックメソッドを実装します。

同じ要領で更新前後にコールバックされるUITableViewも作る事が出来ますので、お試し下さい。

cocos2dとcocoaインタフェースのハイブリッドを実装する際、つい便利なaddChildViewControllerを使ってしまいがちですが、使うとアプリがバックグラウンドに移行するタイミングで終了してしまいます。

昔の方法になりますが、addChildViewController:を使わずにメンバ変数にviewControllerを保持しておき、rootViewController.viewに対してaddSubView:を実行するようにします。