0

我有一个包含多个 SKScene 的应用程序。为了让它保持敏捷,我有一个 UIViewController,它可以处理 1 个 SKView。

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