ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] XIB 만 가지고 이벤트 핸들링 하는법, xib cell 내부에 또 cell 이있는경우
    개발/Swift 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"];
    
    

    댓글

Designed by Tistory.