iOS/UIKIT

테이블 내에 있는 컬렉션뷰는 어떻게 구분할까?

밤새는 탐험가89 2024. 9. 28. 06:27

 

위의 이미지를 보면 자연여행, 문화여행 이라는 문구가 있는 곳은 컬렉션뷰를 통해 구현했습니다. 

 

그 밑에는 테이블뷰로 구성되어있고, 각 행은 컬렉션뷰 입니다. 

 

각 뷰의 셀을 눌렀을 때 구분하고자 아래와 같이 코드를 작성했습니다. 

// MARK: - extension CollectionView
extension HomeViewController: UICollectionViewDelegate, UICollectionViewDataSource {
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        
        // 카테고리 부분 컬렉션 뷰
        if collectionView == homeView.homeheaderView.categoryView.categoryCollectionView {
            return categories.count
        }
        
        
        // 테이블뷰에 있는 컬렉션 뷰
        switch collectionView.tag {
        case 0:
            return locationReceivedItems.count
        case 1:
            return categoryReceivedItems.count
        case 2:
            return popularReceivedItems.count
        default:
            return 0
        }
        
    }


if collectionView == homeView.homeheaderView.categoryView.categoryCollectionView를 사용해서 특정 컬렉션 뷰를 구분하고, 나머지 테이블뷰의 컬렉션뷰는 tag로 구분하는 것은 올바른 방법입니다.

 

이 방식은 특히 각 컬렉션 뷰가 서로 다른 데이터를 처리하고 있고, 구분할 수 있는 명확한 기준이 있을 때 매우 유용합니다. tag를 통해 테이블 뷰 내에서 각각의 컬렉션 뷰를 구분하는 것은 직관적이고, 성능에도 문제를 일으키지 않는 효율적인 방법입니다.

 

다만, 나중에 tag를 관리하는데 헷갈리지 않도록, 가독성을 높이기 위해 enum이나 static constant를 사용해서 tag 값을 정의하면 더 좋을 수 있습니다. 예를 들어:

 

// MARK: - CollectionViewTags Enum
enum CollectionViewTags: Int {
    case location = 0
    case category
    case popular
}

// MARK: - extension CollectionView
extension HomeViewController: UICollectionViewDelegate, UICollectionViewDataSource {
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        
        // 카테고리 부분 컬렉션 뷰
        if collectionView == homeView.homeheaderView.categoryView.categoryCollectionView {
            return categories.count
        }
        
        // 테이블뷰에 있는 컬렉션 뷰
        guard let collectionViewTag = CollectionViewTags(rawValue: collectionView.tag) else {
            return 0
        }
        
        switch collectionViewTag {
        case .location:
            return locationReceivedItems.count
        case .category:
            return categoryReceivedItems.count
        case .popular:
            return popularReceivedItems.count
        }
    }
}

 

 

이 코드에서 변경된 부분은:

  1. CollectionViewTags enum을 사용해 각 컬렉션 뷰의 tag 값을 의미 있게 관리.
  2. collectionView.tag를 직접 사용하는 대신 CollectionViewTags(rawValue: collectionView.tag)로 변환하여 처리.
  3. switch 구문에서 enum의 각 케이스를 사용하여 가독성을 높이고, 실수할 가능성을 줄임.

이렇게 하면 나중에 tag 값을 수정하거나 추가할 때도 코드 유지보수가 더 쉬워집니다.