개발/Swift

[Swift] XIB 만 가지고 이벤트 핸들링 하는법, xib cell 내부에 또 cell 이있는경우

덤벨로퍼 2024. 12. 21. 19:23

XIB 만 가지고 버튼 이벤트 핸들링 하는법

VC → xib(view) → button 의존 상황

button 터치 이벤트를 VC에서 받아야함 근데 xib를 위한 커스텀 class 없는 상황

xib와 class 파일을 묶어서 버튼 접근이나 버튼 액션을 처리하지 못하는 상황

해결 방법

  1. xib 를 위한 class 를 생성하여 이벤트를 받아 처리한다
  2. tag를 사용한다.viewWithTag활용하여 이벤트 받아옴
  3. if let backgroundView = nib?.instantiate(withOwner: self, options: nil).first as? UIView { if let pastButton = backgroundView.viewWithTag(100) as? UIButton { pastButton.addTarget(self, action: #selector(presentPastReportLink), for: .touchUpInside) } }
  4. xib 파일→ 버튼에 tag를 설정한다. 1을 설정한경우 동작하지 않아서 100을 설정

xib로 부른 cell 내부에 또 cell 이있는 경우

로직 리팩토링을 위해 storyboard 내부에 있는 cell 부분을 xib 파일로 옮겨서 VC에서 사용하고 있었다.

기존 : storyboard + VC →  TableViewCell →  CollecionViewCell

변경: VC → xib + TableViewCell → xib + CollecionViewCell

$0.register(albumCellNil, forCellReuseIdentifier: "AlbumTableViewCell")

table view cell 등록했는데 등록 관련 크래시 발생함

 

확인해보니 table view cell 내부에 사용하는 CollectionViewCell을 등록 못하는 에러 발견

xib 내부에는 collectionViewCell이 있음

그런데 기존에도 tableViewCell내부에 collectionview 에 register 하는 코드가 없음(objc 코드)

→ 그럼 어떻게 정상 동작했지?

→ Storyboard에서는 셀 등록을 알아서 해줌, XIB는 안해줌

 

그러면 결국 TableViewCell class 파일 에서 CollecionViewCell 등록해줘야함

→ 현재 상태인 TableViewCell nib 을 그대로 불러서 collectionViewCell 못가져오나?

→ 실패

→ 결국 collectionViewCell nib 파일 분리 하여 해결

UINib *cellNib = [UINib nibWithNibName:@"AlbumTableViewCellPhotoCollectionCell" bundle:nil];
UINib *emptyCellNib = [UINib nibWithNibName:@"AlbumTableViewCellPhotoCollectionEmptyCell" bundle:nil];
[self.imageCollectionView registerNib:cellNib forCellWithReuseIdentifier:@"AlbumTableViewCellPhotoCollectionCell"];
[self.imageCollectionView registerNib:emptyCellNib forCellWithReuseIdentifier:@"AlbumTableViewCellPhotoCollectionEmptyCell"];