CollectionView & filling with items

EN·2023년 4월 1일
  1. 콜렉션 뷰를 위한 데이터소스를 생성한다.
  2. "셀 프로바이더"를 구현해야한다.
  3. 데이터의 현재상태를 생성한다.
  4. 유저인터페이스에서 데이터를 디스플레이한다.

콜렉션 뷰는 다양한 레이아웃과 프레젠테이션 책임이 있음. 이게 무슨말임? 걍 콜렉션 뷰에서는 뷰 관련된건 알아서 처리해주니까, 일단 데이터에 먼저 집중해라 이거같음.

여기서 UICollectionViewDiffableDataSource "제네릭 클래스"가 등장!
얘는 효율적, 그리고 안전하게 콜렉션뷰의 데이터를 업데이트하는 기능을 제공한다구!

콜렉션뷰와 셀 프로바이더를 데이터 소스의 init()에다가 넘겨줌으로서 인스턴스를 생성할 수 있다. <- 이게 무슨말이냐? 소스코드로 보자.

typealias DataSource = UICollectionViewDiffableDataSource<Int, ReminderItem>

func makeDataSource() -> DataSource {
    let reminderCellRegistration = self.reminderCellRegistration()
    return DataSource(collectionView: collectionView) {
        collectionView, indexPath, item -> UICollectionViewCell? in
        return collectionView.dequeueConfiguredReusableCell(
            using: reminderCellRegistration, for: indexPath, item: item)
    }
}

lazy var dataSource = makeDataSource()

셀 프로바이더가 없는데 무슨 셀 프로바이더를 받어?
셀 프로바이더는 함수야. XCode에서 DataSoucre를 입력하면 이렇게 뜸!

근데 cellProvider는 함수라고 했지? 그래서 클로저를 넣어줄 수 있음!
우린 후행클로저로 작성해볼것임(후행클로저를 쓰는 이유는? 클로저가 조금 길어지거나 가독성이 떨어진다 싶을 때, 후행 클로저 기능을 사용하면 좋음 ㅎㅎ 그리고 후행 클로저는 맨 마지막 전달인자로 전달되는 클로저에만 해당되는 것임, 그리고 단 하나의 클로저만 전달인자로 전달하는 경우, 소괄호를 생략 해줄 수도 있는것이지.)


컬렉션 뷰는 필요에 따라 셀프로바이더에게 셀을 요청하기도 함.
컬렉션 뷰는 화면 밖으로 스크롤되는 셀을 자동으로 재활용함! 그래서 앱에선 적은 수의 셀만 생성하면 됨.
이 셀 재사용으로 인해 부드러운 스크롤이 가능한것임.
걍 스크롤할때 셀 프로바이더한테 재사용 셀을 요청한다는 의미인듯


UICollectionViewListCell에는 세 가지 구성 속성이 있음.
contentConfiguration - 셀의 레이블, 이미지, 버튼
backgroundConfiguration - 셀의 배경색, 그라데이션, 이미지 및 기타 시각적 특성
configurationState - 사용자가 셀을 선택, 강조 표시, 드래그 하거나 상호작용할 때 셀의 스타일 설명

아래 코드는 이전 섹션의 DataSource가 제공하는 미리 알림을 표시하도록 셀을 등록하고 구성하는 프로세스를 보여준다.

func reminderCellRegistration() ->
UICollectionView.CellRegistration<UICollectionViewListCell, ReminderItem> {
    return .init { cell, _, item in
        guard let reminder = item.reminder else { return }
        var configuration = cell.defaultContentConfiguration()
        configuration.text = reminder.title
        configuration.textProperties.color = .darkGray
        cell.contentConfiguration = configuration
        
        var backgroundConfig = UIBackgroundConfiguration.listPlainCell()
        backgroundConfig.cornerRadius = 8
        cell.backgroundConfiguration = backgroundConfig
    }
}

이제 각 데이터도 구성했고, 셀도 구성했겠다.
이제 해야할건 데이터 스냅샷을 생성해야함.
왜? 컨트롤러에서 이제 뷰랑 상호작용해야되는데 데이터가 바뀐것들을 실시간으로 반영해줘야하니까!

컬렉션 뷰에는 셀을 배치하기 위해 앱 데이터에 대한 설명이 필요함.
diffable 데이터 소스는 NSDiffableDataSourceSnapshot 인스턴스를 사용하여 주어진 시간의 데이터 상태를 나타냄.
컬렉션 보기가 처음 로드될 때와 앱의 데이터가 변경될 때마다 새 스냅샷을 생성함. 걍 마지막 말만 중요함.

func applyInitialSnapshots() {
    // Define snapshot with same <section,item> types as the data source.
    var initialSnapshot = NSDiffableDataSourceSnapshot<Int, ReminderItem>()
    let reminderItems = reminderStore.reminders.map { reminder in
        return ReminderItem(reminder: reminder)
    }
    
    initialSnapshot.appendSections([0]) // There is only one section in this list.
    initialSnapshot.appendItems(reminderItems, toSection: 0)
    dataSource.apply(initialSnapshot, animatingDifferences: false)
}

이게 신기한게 알아서 데이터 차이를 비교해서 해준다네

그리고 iOS14부터 Modern Collection View를 사용함.
여기 참고하자.
https://leechamin.tistory.com/555

profile
iOS/JUJITSU

0개의 댓글