본문 바로가기
UIKIT

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

by 밤새는 탐험가89 2024. 10. 19.
728x90
SMALL

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가 직접 화면 전환을 관리할 수 있어 더 구조적인 코드가 됩니다.

 

 

728x90
LIST