2017-04-14 1 views
2

UICollectionView을 서브 클래스하고 dataSource을 처리합니다. CollectionView의 init 단계 중에 dataSourceself에 할당합니다.CollectionView dataSource는 UICollectionViewController를 사용할 때 작동하지 않지만 CollectionView와 함께 UIViewController를 사용할 때 작동합니다.

import Foundation 
import UIKit 

class CollectionViewSubclass: UICollectionView, UICollectionViewDataSource { 

    public override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) { 
     super.init(frame: frame, collectionViewLayout: layout) 
     dataSource = self 
    } 

    public required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     dataSource = self 
    } 

    public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     // This is called for the first case, but not the second 

     return 1 
    } 

    public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     // This is called for the first case, but not the second 

     return UICollectionViewCell() 
    } 
} 
  • 사례 1 : 나는 CollectionViewSubclassUIViewController 돌며을 사용할 때, 모두가 잘 작동하고 모두 dataSource 방법 (numberOfItemsInSectioncellForItemAt가 제대로이라고
  • 경우 2. 나는 CollectionViewSubclassUICollectionViewController 돌며를 사용 어떤 이유로 dataSource 메서드가 호출되지 않았지만 디버깅 할 때 init(coder:)이 실제로 호출되었고 dataSource = self이 실행되었습니다.하지만 어떻게 든 데이터 소스에이 다시 발생했습니다. ter 단계가 있으므로 dataSource 메서드가 호출되지 않습니다.

나는 그 주위에 내 머리를 얻을 수 없으며 디버깅을 시도했지만 아무 소용이 없었다. 그 이유를 말해 주거나 디버깅 아이디어를 주시면 감사하겠습니다. 감사!

편집 : 나는 init 단계 이후 dataSource = self를 할당 할 때, 모든 것이 잘 작동합니다. 그러나 나는 오히려 init 단계에서 그것을 할 것입니다. init 동안 어떻게 작동합니까? UICollectionViewConrtollerdocs 가입일

답변

1

는 :

스토리 보드 또는 펜끝 파일 콜렉션 뷰로드 컬렉션 뷰에 대한 데이터 소스 위임 개체 nib 파일로부터 얻어진다. 데이터 소스 또는 위임이 지정되지 않은 경우 컬렉션보기 컨트롤러 은 지정되지 않은 역할에을 할당합니다.

따라서 UICollectionViewConrtoller을 사용하는 경우 사용자 정의 컬렉션보기에 dataSource를 다시 할당해야합니다.

+0

문서에서 매우 잘 잡습니다. 하지만 위에서 볼 수 있듯이 dataSource를 내 사용자 정의 collectionView에 할당하고 있습니다. 내가 뭘 놓치고 있니? 나는 틀린 장소에서 그것을하고 있다고 생각하니? init 단계에서 어디에서 그렇게 할 수 있습니까? 왜냐하면 나중에 과제를 수행 할 때 제대로 작동하지만 init 단계에서 dataSource를 할당하고 싶습니다. –

+0

'UICollectionViewConrtoller'를 사용하면 어떻게됩니까 : ** 1. ** View Controller가 초기화됩니다. . ** 2. ** 사용자 정의 콜렉션 뷰가 초기화됩니다. (이 시점에서'dataSource'는 콜렉션 뷰입니다. ** 3. ** 콜렉션 뷰가 뷰 컨트롤러에 할당됩니다 -이 시점에서 뷰 컨트롤러는'dataSource'를 인수합니다. – njuri

+0

init 단계에서 datasource를 지정하려고한다는 아이디어를 얻었지만, 스스로를 구성하는 뷰를 갖는 것은 좋지 않습니다. 메인 뷰 태스크는 * 정보를 표시하고 사용자 이벤트를 보내는 것입니다. -보기 구성 및 대리인 및/또는 데이터 소스가 됨 – njuri