[Day 45] iOS 컬렉션 뷰가 보이지 않는 문제 해결
iOS 킥보드 앱 개발 중 UICollectionView가 보이지 않는 문제를 디버깅하고 해결 과정.
😭 또 왜 안보이니…
네이버 검색 API를 사용해서 검색 결과를 받아 와서 그 결과를 CollectionView에 띄워주는 기능을 만들려고 했어요 그런데 이번엔 UICollectionView가 안보여.. 왜지? 이번에는 여러가지 문제가 있었어요..
🐞 디버깅 과정
데이터가 안들어가나..? 해서
(lldb) p places
([SSENG.Place]) 0 values {}
디버깅을 해본 결과 들어가지 않았다… 데이터가 콘솔 로그에 잘 찍혀서 넣었다고 생각한거였다 그래서 호다닥 추가해주고 다시 해본결과! 드디어 데이터는 들어갔는데 여전히 뷰는 뜨지 않았다…. 왜그런가 해서 뷰디버깅을 했는데? 제약조건 충돌도 나지 않았다.
왜그럴까… 했다…
⁉️ 문제의 원인
문제를 드디어 찾았다. 뷰 디버깅하면서 제약조건 충돌이 나지 않아서 제약조건이 문제가 아니라고 생각했는데 문제는 제. 약. 조. 건. 이친구가 문제였다.
1
2
3
4
5
6
7
8
9
searchCollectionView.snp.makeConstraints {
$0.top.equalTo(searchBar.snp.bottom)
$0.leading.trailing.equalTo(searchBar)
$0.height.equalTo(0)
}
heightConstraint = searchCollectionView.snp.prepareConstraints {
$0.height.equalTo(250)
}
이렇게 prepareConstraints
로 데이터를 저장해놓고
UISearchBar
에 text
가 입력 되면 delegate
로 showSearchCollectionView
를 호출하고, 탭 또는 스크롤시 hiddenSearchCollectionView
를 호출을 하였다.
여기까지 로직은 틀린게 없었는데 알고보니 처음 선언한 제약조건의 height의 우선순위가 놓았던 것이다. 그래서 prepareConstraints의 제약조건이 충돌이 난 것이다.
해결책
그렇게 문제의 원인을 찾아 우선순위를 낮게 주는 것이다. 그게 바로
1
.priority()
이 친구였다..
이친구는 3가지의 타입으로 이루어져 있는데
1
2
3
.priority(.required) // 필수 제약조건
.priority(.high) // 기본 높은 우선순위
.priority(.low) // 기본 낮은 우선순위
이렇게 3가지 값이있는데 동적으로 레이아웃 조정할 때 사용된다. 예를들어
1
2
3
4
exampleView.snp.makeConstraints {
$0.height.equalTo(100).priority(.high) // 높이 100을 강하게 요청하지만 절대는 아님
$0.height.lessThanOrEqualTo(150) // 최대 150까지는 허용
}
이 코드는 높이 100을 선호하지만? 필요에 따라 최대 150 까지 늘어날 수 있다! 라는 의미이다.
꼭 기억 해놓자!
맺으며: 춘식이와 함께하는 스마트한 개발
제약조건에 대해 이해했다고 생각했었는데… 아직 모르는게 산더미라는걸 느끼게 된 오류였다. 나는 그 GPT와 디버깅을 3시간을 했는데 튜터님께 조언을 구하니.. 10초만에 문제를 해결해 주셨다 허탈했다… 역시 아직까지는 AI는…chatGPT이 멍청이 그래도 여러모로 많이 배우게 됐다!!
더 열심히 노력 해서 좋은 iOS Developer가 되자!
혹시 이 글을 보시는 분들 중 더 유용한 팁이 있다면 댓글로 많이 알려주세요!