0

複数の SKScenes を含むアプリがあります。スムーズに保つために、1 つの SKView を処理する単一の UIViewController があります。

SKScenes の 1 つに UICollectionView を追加しようとしています。ただし、コレクション ビューのデリゲートを初期化する SKScene に設定しようとすると問題が発生します。

ここで初期化します:

- (id)initWithSize:(CGSize)size
{
    if (self = [super initWithSize:size]) {

        //Initialise collectionView
        UICollectionViewLayout *layout = [[UICollectionViewLayout alloc] init];
        _collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height) collectionViewLayout:layout];
        _collectionView.delegate = self;
        _collectionView.dataSource = self;
        [_collectionView setBackgroundColor:[UIColor redColor]];
    }
    return self;
}

初期化後、以下を呼び出してコレクション ビューを UIViewController のビューのサブビューとして追加します。

- (void)didMoveToView:(SKView *)view
{
    [self.view addSubview:_collectionView];
}

ただし、デリゲートまたはデータソース メソッドは呼び出されません。ヘッダーを設定しました:

@interface BrowseScene : SKScene <UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>

self をデリゲートとして設定しても、コレクション ビューが追加されると、UIViewController の SKView のサブビューとして追加されるため、初期化した SKScene への参照がないと推測しています。私は電話してみました:

_collectionView.delegate = self.view.scene;

しかし、SKScene は UICollectionViewDelegate と互換性のない型であるというコンパイラ エラーが発生します。

だから私の質問は、これにどのようにアプローチするのが最善ですか?

4

1 に答える 1

2

問題は、どこではなく、UICollectionView を初期化する方法にありました。また、デリゲート クラスとして SKScene を設定しても問題ありません。

デリゲートが呼び出されなかった主な理由は、collectionView を空のレイアウト オブジェクトで初期化したためです (UICollectionViewLayout は単なる抽象クラスであるため)。代わりに標準の UICollectionViewFlowLayout で初期化し、クラスの初期化時にメソッドが呼び出されました。

への電話も逃した

[_collectionView registerClass:[collectionViewCell class] forCellWithReuseIdentifier:@"collectionViewCell"];

(完全なコードでは、reloadData を呼び出していたので、ここでは問題ではありませんでした)。

于 2014-01-27T12:04:09.513 に答える