ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [IOS]UICollectionViewDataSource 필수 메소드 cellForItemAt doesn't called 이슈
    IOS/UIKit 2022. 2. 13. 15:29

    IOS 개발 공부를 하며 프로젝트를 진행하던 추적하기 힘든 이슈가 발생해 리포팅한다.

    프로젝트는 FastCampus 온라인강의 Diary앱을 만들던 중 다음과 같은 오류가 발생했다.

    https://storage.googleapis.com/static.fastcampus.co.kr/prod/uploads/202110/123023-24/[패스트캠퍼스]-교육과정소개서-30개-프로젝트로-배우는-ios-앱-개발-with-swift--1-.pdf 

    Delegate를 위임받고, collection view의 cell들을 배치시키는데 부분에 있어 UICollectionViewDataSource protocol 필수 구현 method인 func ...(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

    가 호출되거나 실행되지 않은 것이 이슈였다.

     

    stackOverflow의 도움을 받은 결과 layout 클래스인 UICollectionViewLayout를 직접 사용하는 것과 subclass인 UICollectionViewFlowLayout를 사용하라는 권장사항 글을 읽다 해결하게 되었다.

    코드를 간략하게 보자면 다음과 같다.

     @IBOutlet weak var collectionView: UICollectionView!
     
    override func viewDidLoad() {
            super.viewDidLoad()
            self.configureCollectionView()
        }
        
        
        private func configureCollectionView(){
            self.collectionView.collectionViewLayout = UICollectionViewLayout() //수정 전
            self.collectionView.collectionViewLayout = UICollectionViewFlowLayout() //수정 후
            self.collectionView.contentInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
            self.collectionView.delegate = self
            self.collectionView.dataSource = self
        }
    //Collection view layout 설정하기
    extension ViewController: UICollectionViewDelegateFlowLayout{
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            return CGSize(width: (UIScreen.main.bounds.width / 2)-20, height: 200)
        }
    }

    collection의 layout을 UICollectionViewDelegateFlowLayout 상속받아 구현했는데, 정작 UIcollectionView의 객체는 UICollectionViewLayout를 인스턴스화 시켰다.

    따라서 정상적으로 동작하지 않았고, collection View 구조 특성상 layout layer층이 구현되지 않아 cell이 표시되지 않을뿐 더러

    datasource 구현체 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 메소드도 debuggin시 breakpoint에 잡히지도 않았다.

     

    https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/CollectionViewBasics/CollectionViewBasics.html#//apple_ref/doc/uid/TP40012334-CH2-SW1

    UICollectionViewDelegateFlowLayout과 UICollectionViewDelegateLayout의 차이는 배치 차이만 있을뿐 둘 중 무엇을 상속받아 구현해도 상관 없지만, 저자는 구현체를 UICollectionViewDelegateFlowLayout로 구현하고 정작 UICollectionViewDelegateLayout로 collectionview의 레이아웃층을 객체로 만들었으니 오류가 발생했다.

     

    중요한 점은 collectionview layout이 제대로 구현되지 않으면 cellForItemAt이 호출 및 디버깅 되지 않는다는 점이 이 글의 포인트이다. 

     

     

     

Designed by Tistory.