在SKScene上使用UICollectionView

时间:2014-01-24 17:51:22

标签: objective-c uicollectionview sprite-kit skscene skview

我有一个带有几个SKScenes的应用程序。为了让它保持活泼,我有一个UIViewController,它可以处理1个SKView。

我正在尝试将UICollectionView添加到其中一个SKScenes。但是当我尝试将集合视图的委托设置为初始化它的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的不兼容类型。

所以我的问题是,如何最好地接近这个?

1 个答案:

答案 0 :(得分:2)

事实证明,问题在于我如何初始化UICollectionView,而不是在哪里。将SKScene设置为委托类是完全可以的。

代理没有被调用的主要原因是因为我用一个空的布局对象初始化了collectionView(因为UICollectionViewLayout只是一个抽象类)。我用标准的UICollectionViewFlowLayout初始化,然后在初始化类时调用这些方法。

我也错过了对

的电话
[_collectionView registerClass:[collectionViewCell class] forCellWithReuseIdentifier:@"collectionViewCell"];

(在完整的代码中,我调用了reloadData,所以这不是问题)。