2014-01-24 51 views
0

我有幾個SKScenes的應用程序。爲了保持活潑,我有一個單獨的UIViewController,可以處理1個SKView。在SKScene上使用UICollectionView

我想添加一個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> 

我猜測,儘管設置自我爲代表,一旦收集視圖中添加的,它被添加作爲UIViewController的SKView的子視圖,因此不具有參考到初始化它的SKScene。我試過電話:

_collectionView.delegate = self.view.scene; 

但我得到一個編譯器錯誤,說SKScene是UICollectionViewDelegate不兼容的類型。

所以我的問題是,如何最好地解決這個問題?

+1

你的self.view.scene錯誤是因爲它只知道它是一個SKScene,而不是你特定的場景子類。我的猜測是,通過將你的子視圖添加到didMoveToView中的視圖,它永遠不會被告知加載數據,因爲viewDidLoad/WillAppear/DidLoad已被調用。嘗試在某處調用[_collectionView reloadData]並查看是否填充它。 – Devin

+0

您是否嘗試初始化didMoveToView中的集合視圖? – LearnCocos2D

回答

1

事實證明,問題出在我如何初始化UICollectionView,而不是在哪裏。將SKScene設置爲委託類是完全可以的。

代表未被調用的主要原因是因爲我初始化了一個空佈局對象的collectionView(因爲UICollectionViewLayout只是一個抽象類)。我用一個標準的UICollectionViewFlowLayout來初始化,然後在類初始化時調用這些方法。

我也錯過了呼叫

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

(在完整代碼,我不得不reloadData調用,因此在這裏不是問題)。