2

自己完結型のUICollectionViewサブクラス (独自のデータ ソースおよびデリゲートとして機能する) を作成して、別の viewController にロードできるようにしたいと考えています。これが私がこれまでに持っているものです:

CustomCollectionView.h

@interface CustomCollectionView : UICollectionView <UICollectionViewDataSource, UICollectionViewDelegate>

@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;

@end

CustomCollectionView.m

#import "SSCalendarView.h"

@implementation SSCalendarView
@synthesize collectionView;

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];

    if (self) {

        [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];

        [self registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Identifier"];

        [self addSubview:collectionView];
    }
    return self;
}

// Below are UICollectionViewDataSource and UICollectionViewDelegate methods

@end

CustomCollectionView.xib

  • ビューが 1 つだけ含まれています - UICollectionView。そのクラスはに設定されていますCustomCollectionView
  • ファイルの所有者のクラスもに設定されていますCustomCollectionView
  • ファイルの所有者はUICollectionViewのデリゲートであり、データ ソースです

ここでかなり多くのことが間違っていることを理解しています。しかし、おそらくこれを出発点として使用できます。

私の質問は次のとおりです。

  • このサブクラスを正しく実装するには? ビューをxibから完全にロードしたい
  • まず、潜在的な MVC 違反 (このサブクラスがすべてを実行します) は別として、UICollectionView を独自のデータ ソースおよびデリゲートにすることはできますか?
  • 上記が可能である場合、View Controller で使用するこのサブクラスのインスタンスを正しく作成するにはどうすればよいですか?
4

2 に答える 2

1

この目的に使用できるオブジェクトが既に存在します - UICollectionViewController。これは、サブクラス化して任意のビュー コントローラーに (子ビュー コントローラーとして) 追加することができ、データソースおよびデリゲートであるコレクション ビューが既に含まれています。

現在のアプローチの問題は次のとおりです。

  • ご指摘のとおり、ビューを独自のデータソースとデリゲートにすることで、1 つのオブジェクトに責任を負わせすぎています。
  • xib のファイルの所有者は、xib 内からのオブジェクトにすることはできません。xib をロードすると、owner引数に送信するオブジェクトがファイルの所有者になります。現在持っているコードを使用して実際に何をするのかわかりません。
  • とにかく xib の使用を主張する理由がわかりません。追加のファイルの頭痛と nib の読み込みの複雑さを除いて、これは何をもたらしますか? コレクションView Controllerを作成するだけで、レイアウトを指定し、initメソッドとviewDidLoadメソッドでセルを登録できます。
于 2013-11-10T08:04:09.450 に答える
0

まず第一に、View を View Controller のように振る舞わせることは MVC の違反です。

理論的には、ビューを強制的にデリゲートおよびデータ ソースとして機能させることは可能ですが、お勧めしません。

それでもやりたい場合は、デリゲートとデータ ソースを に割り当てるだけですself

self.dataSource = self;
self.delegate = self;

および.h ファイルUICollectionViewDelegateでプロトコルを採用UICollectionViewDataSource

于 2013-11-09T21:28:15.227 に答える