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)
}
}
요약
- Delegate Protocol 정의: 셀 클릭 이벤트를 HomeViewController로 전달하기 위한 프로토콜을 만듭니다.
- HomeFeedTableViewCell에 Delegate 설정: 컬렉션 뷰 셀 클릭 시 delegate 메서드를 호출하여 선택된 데이터를 전달합니다.
- HomeViewController에서 Delegate 구현: HomeFeedTableViewCellDelegate 프로토콜을 구현하여 화면 전환을 처리합니다.
이렇게 하면 HomeFeedTableViewCell에서 직접 navigationController에 접근하지 않아도 되고, HomeViewController가 직접 화면 전환을 관리할 수 있어 더 구조적인 코드가 됩니다.
'iOS > UIKIT' 카테고리의 다른 글
테이블에 3개씩 끊어서 데이터를 더보기 해주는 방법 (0) | 2024.10.21 |
---|---|
셀의 개수에 맞춰 자동으로 높이가 조절되는 테이블 뷰를 구현 (1) | 2024.10.21 |
앱의 데이터 갱신하려면 어떻게 할까? (0) | 2024.10.16 |
collectionView.reloadData()는 어디에 넣을까? - 추가 (2) | 2024.10.14 |
StackView에는 그림자 효과를 넣을 수 없다? (0) | 2024.10.14 |