2014-01-24 4 views
0

여러 SKScenes가있는 앱이 있습니다. 그것을 유지하기 위해, 나는 하나의 SKView를 처리하는 단일 UIViewController 있습니다.SKScene을 통한 UICollectionView 사용

SKScenes 중 하나에 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> 

내가 컬렉션 뷰가 추가되면 대리인으로 자신을 설정에도 불구하고, 그것이있는 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 호출을했다).