teunteun2
[Swift] Collection View Cell 내부의 Button Action (tag & delegate & closure 차이점) 코드X 본문
[Swift] Collection View Cell 내부의 Button Action (tag & delegate & closure 차이점) 코드X
teunteun2 2022. 5. 10. 00:45CollectionView Cell 내부에
버튼이 있는 경우를 자주 볼 수 있는데요,
이 버튼의 action을 세가지 방법으로 구현해본 후
차이점을 기록해보려고 합니다
1. 버튼 태그에 IndexPath.row를 담는 방법
장점
- 뛰어난 장점은 아니지만
CollectionVIew delegate 메서드인 cellForRowAt 외부에서
@objc selector Action을 정의할 수 있어요
내부에서 액션함수를 정의하면
delegate 메서드가 무거워지니까..
단점
- 하지만 해당 방법으로 버튼 액션을 구현할 경우
cellForRowAt 메서드 안에서
Button의 addTarget을 해야합니다
- 태그를 사용하는 방법은 추천하지 않는다고 해요
잘못하면 row가 꼬일 수 있다고 들은 ..
2. delegate 패턴 사용
장점
- cellForRowAt 메서드 외부에서
cell 프로토콜을 채택해서 Action 함수 정의 가능
뭔가 깔끔하게 정리된다 !
단점
Cell의 insert 혹은 delete 기능이 있는 경우
어쩔 수 없이 외부에 있는 Action 함수에서
Cell이 몇번째인지 알기 위해
tag를 사용해야 한다.
insert & delete 기능이 없으면
delegate 기능을 쓰는 것이 좋은 것 같다 !
3. closure 사용
클로저를 사용할 경우
Button의 addTarget과 Action 함수 모두
cellForRowAt 메서드 내부에서 정의해주어야 한다
하지만 내부에서 정의하기 때문에
indexPath를 바로 가져올 수 있기 때문에
tag를 사용하지 않아도 됨 !
태그를 쓰지 않기 때문에 꼬이거나 밀릴 일도 없고
버튼 클릭 시 Cell의 insert&delete 기능이 있는 경우엔
클로저를 쓰는 것이 좋은 것 같다.
하지만 cellForRowAt 메서드의 코드가
길어진다는 것이 단점...
위 뷰에선
x 버튼을 눌렀을 때 해당 Cell이 삭제되어야 하므로
클로저를 사용해서 버튼 액션을 구현했다.
시간이 되면 코드와 함께
collectionView performBatchUpdates까지
정리해보는 것으로 ..
'iOS' 카테고리의 다른 글
[Swift] 키보드에 맞춰 ScrollView Content Inset 변경하기 (0) | 2022.05.21 |
---|---|
[Swift] ReactorKit (0) | 2022.05.10 |
[Swift] Extension NSMutableAttributedString (0) | 2022.05.08 |
[Swift] XIB를 이용한 커스텀 뷰 만들 때 - required init?(coder:NSCoder) & awakeFromNib() 의 호출 시점 (0) | 2022.05.07 |
[Swift] GestureRecognizer&TextKit 으로 UILabel text 클릭 이벤트 발생시키기 (0) | 2022.04.23 |