iOS/UIKIT

HomeFeedTableViewCell에서는 navigationController에 접근할 수 없어서 문제가 발생

밤새는 탐험가89 2024. 10. 19. 05:32

1. Delegate를 활용하여 ViewController에서 네비게이션 처리

HomeFeedTableViewCell에서 직접 화면 전환을 하지 않고, 셀에서 이벤트를 델리게이트를 통해 HomeViewController로 전달하여 화면 전환을 처리하는 방법입니다.

 

Step 1: Delegate Protocol 정의

protocol HomeFeedTableViewCellDelegate: AnyObject {
    func didSelectItem(_ selectedItem: SpotItem)
}

 

Step 2: HomeFeedTableViewCell에 Delegate 속성 추가 및 호출

class HomeFeedTableViewCell: UITableViewCell, UICollectionViewDelegate {
    weak var delegate: HomeFeedTableViewCellDelegate?

    @IBOutlet weak var feedCollectionView: UICollectionView!

    var selectedSpotItem: [SpotItem] = [] // 컬렉션 뷰 데이터 소스
    
    override func awakeFromNib() {
        super.awakeFromNib()
        
        feedCollectionView.delegate = self
        feedCollectionView.dataSource = self
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        collectionView.deselectItem(at: indexPath, animated: true)
        
        let selectedItem = selectedSpotItem[indexPath.item]
        
        // Delegate 호출
        delegate?.didSelectItem(selectedItem)
    }
}

 

Step 3: HomeViewController에서 Delegate 구현 및 설정

class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, HomeFeedTableViewCellDelegate {
    
    @IBOutlet weak var homefeedTable: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        homefeedTable.delegate = self
        homefeedTable.dataSource = self
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: HomeFeedTableViewCell.identifier, for: indexPath) as? HomeFeedTableViewCell else {
            return UITableViewCell()
        }

        // HomeFeedTableViewCell 델리게이트 설정
        cell.delegate = self
        
        // 필요한 데이터 설정 및 반환
        return cell
    }

    // 델리게이트 메서드 구현
    func didSelectItem(_ selectedItem: SpotItem) {
        let detailVC = DetailSpotViewController()
        detailVC.selectedSpotItem = selectedItem
        
        // 화면 전환 처리
        navigationController?.pushViewController(detailVC, animated: true)
    }
}

 

요약

  1. Delegate Protocol 정의: 셀 클릭 이벤트를 HomeViewController로 전달하기 위한 프로토콜을 만듭니다.
  2. HomeFeedTableViewCell에 Delegate 설정: 컬렉션 뷰 셀 클릭 시 delegate 메서드를 호출하여 선택된 데이터를 전달합니다.
  3. HomeViewController에서 Delegate 구현: HomeFeedTableViewCellDelegate 프로토콜을 구현하여 화면 전환을 처리합니다.

이렇게 하면 HomeFeedTableViewCell에서 직접 navigationController에 접근하지 않아도 되고, HomeViewController가 직접 화면 전환을 관리할 수 있어 더 구조적인 코드가 됩니다.