iOS/Toy project

[iOS : Toy Project] Todo List 만들기 (4) - CollectionView의 Datasource, Delegate

yevdev 2022. 8. 19. 01:19

이전 포스팅

- TodoList(1)

- TodoList(2)

- TodoList(3)

 

 

 

자세한 코드는 여기로!

 

GitHub - yexjin/iOS_Study: iOS 토이프로젝트 모음집📱

iOS 토이프로젝트 모음집📱. Contribute to yexjin/iOS_Study development by creating an account on GitHub.

github.com

 

 

 

8/18

저번에 CollectionView의 Delegate와 Datasource의 설정 + Inherit Module From Target 체크 에 대해 더 자세히 알아보자

 

1️⃣ CollectionView의 Datasource

- 모든 CollectionView는 Datasource 객체를 가지고 있다.

- 요 Datasource는 앱이 보여주는 컨텐츠 그 자체!

- Datasource를 정의하려면 UICollectionViewDataSource프로토콜을 채택해줘야 한다.

extension TodoListViewController: UICollectionViewDataSource {}

- 이 프로토콜을 채택할 때는 필수적으로 두가지 메소드를 정의해야한다.

// collectionView(_:numberOfItemsInSection:) : 지정된 섹션에 표시할 항목의 개수를 묻는 메서드
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int

// collectionView(_:cellForItemAt:) : 컬렉션뷰의 지정된 위치에 표시할 셀을 요청하는 메서드
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell

 

- 선택적 메소드 

// numberOfSections(in:) : 컬렉션뷰의 섹션의 개수를 묻는 메서드 > 이 메서드를 구현하지 않으면 섹션 개수 기본 값은 1
optional func numberOfSections(in collectionView: UICollectionView) -> Int​

 

➰ CollectionView가 처음 데이터를 로드할 때, Datasource에게 보일 데이터의 정보를 물어보게 된다.

- CollectionView는 뷰를 재사용

- dequeResuableCell(withReuseIdentifier:for:) : item 에 대한 Cell을 얻는 메소드

 

 

➕ CollectionView는 Cell 뿐만 아니라, 다른 타입의 View도 제공! 바로 Supplementary View

- Todo List에서는 Section Header가 이에 해당 (Section Footer 도 있음)

- Cell 과 달리 옵셔널

- dequeueReusableSuppementaryView(ofKind:withReuseIdentifier:for:) : supplementary view를 얻기 위한 메소드

 

 

 

 

2️⃣ CollectionView의 Delegate

- CollectionView 객체는 Delegate 객체를 가지고 선택된 아이템들도 관리할 수 있다.

- 이 프로토콜의 메소드는 모두 선택사항

 

 

➰ Cell의 layout에 대한 delegate

- UICollectionViewDelegateFlowLayout프로토콜을 채택

extension TodoListViewController: UICollectionViewDelegateFlowLayout {}

 

 

3️⃣ Storyboard에서 Datasource와 Delegate 

CollectionView를 Controll로 드래그 -> dataSource, delegate 설정

 

 

 

 

근데,, 여기까지 했는데 화면에 Cell들을 포함한 CollectionView가 뜨지 않았었다.

확인해보니 CollectionView의 Section Header의 Custom Class의 Module 연결이 되어있지 않아서 였는데, Inherit Module From Target의 체크박스에 표시하면 해결~

 

 

 

야하... ~ 

이거 정리하고 나니까 왤케 졸리지 지금 시간 새벽 1시..

내일 아침 7시반 알바인데 ,, 이러다가 3-4시간 자고 알바가는 대참사가 일어날..

정신차려..

 

 

 


 

자, 이어서 계속 해보자!

 

일단 지금까지 진행한 코드로 실행시켜보니,

 

 

 

 

 

 

 

 

 

 

 

 

요로코롬 못생김

 

 

해결방법은

Collection View Flow Layout의 Estimate Size를 Automatic에서 None으로 바꿔주니

 

 

 

 

 

 

 

 

 

 

 

 

 

예쁘게 잘뜸!

 

 

 

🚫 Swift5 혹은 Xcode11 이후부터 UICollectionViewDelegateFlowLayout의 size 결정 메서드가 제대로 동작하기 위해서는 CollectionView Estimate Size 속성을 None으로 바꿔야한다고 함!

 

 

 

Todo 체크 버튼이랑 Todo Delete 버튼 구현은 내일!