설정에도 디퍼블,컴포지셔널을 적용해보자.

<aside> ✏️ 20221027

원래 MVVM으로 만들었기 때문에, 여기에 DiffableDataSource + CompositionalLayout만 추가했다.

</aside>

작업

설정

final class SettingViewController: BaseViewController {
		...
		
    private func bindData() {
        viewModel.setSettingList()
        
        viewModel.list.bind { [weak self] settingList in
            guard let self = self else { return }
            
            var snapshot = NSDiffableDataSourceSnapshot<Int, SettingList>()
            
            snapshot.appendSections([0])
            snapshot.appendItems(settingList, toSection: 0)
            
            self.dataSource.apply(snapshot)
        }
    }
		
}

// MARK: - CollectionView

extension SettingViewController {
    private func createLayout() -> UICollectionViewLayout {
        let configuration = UICollectionViewCompositionalLayoutConfiguration()
        let layout = createCompositionalLayout()
        layout.configuration = configuration
        return layout
    }
    
    private func createCompositionalLayout() -> UICollectionViewCompositionalLayout {
        return UICollectionViewCompositionalLayout { (sectionIndex, NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? in
            let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1),
                                                  heightDimension: .fractionalHeight(1))
            let item = NSCollectionLayoutItem(layoutSize: itemSize)
            
            let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1),
                                                   heightDimension: .absolute(65))
            let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])
            
            let headerSize = NSCollectionLayoutSize(
                widthDimension: .fractionalWidth(1),
                heightDimension: .absolute(118))
            let header = NSCollectionLayoutBoundarySupplementaryItem(
                layoutSize: headerSize,
                elementKind: SettingViewController.sectionHeaderElementKind,
                alignment: .top
            )
            
            let section = NSCollectionLayoutSection(group: group)
            section.boundarySupplementaryItems = [header]
            return section
        }
    }
}

이슈