Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

teunteun2

[Swift] Collection View Cell 내부의 Button Action (tag & delegate & closure 차이점) 코드X 본문

iOS

[Swift] Collection View Cell 내부의 Button Action (tag & delegate & closure 차이점) 코드X

teunteun2 2022. 5. 10. 00:45

CollectionView Cell 내부에

버튼이 있는 경우를 자주 볼 수 있는데요,

 

이 버튼의 action을 세가지 방법으로 구현해본 후

차이점을 기록해보려고 합니다

 

불러온 이미지를 삭제할 수 있는 X 버튼

 

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까지

정리해보는 것으로 ..