✅ NavigationController에서 push가 안 되는 이유 & 해결 방법
🚀 현재 didSelectItemAt은 잘 호출되고 있지만, pushViewController가 동작하지 않는 문제
👉 이유: SearchResultViewController는 UISearchController의 searchResultsController로 설정되어 있어서 네비게이션 스택에 포함되지 않음!
👉 따라서 pushViewController가 동작하지 않음!
🔥 해결 방법: navigationController로 감싸서 Push 가능하게 만들기
✅ 1. present()가 아니라 pushViewController()를 사용하고 싶다면?
✔ DetailViewController를 UINavigationController로 감싸서 present 할 필요 없음!
✔ 대신, 현재 SearchResultViewController가 navigationController를 가지고 있는지 확인해야 함
✔ 현재 searchResultsController는 네비게이션 스택에 없기 때문에, navigationController가 nil일 가능성이 높음!
🔹 🚀 해결 방법 1: 현재 navigationController 확인 후 pushViewController() 실행
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
guard let selectedCategory = dataSource?.itemIdentifier(for: indexPath) else { return }
let detailVC: UIViewController
switch selectedCategory {
case .movie(let movie):
print("✅ 선택된 영화: \(movie.title)")
detailVC = DetailViewController(contentID: movie.id, contentType: .movie)
case .tv(let tv):
print("✅ 선택된 TV 프로그램: \(tv.title)")
detailVC = DetailViewController(contentID: tv.id, contentType: .tv)
case .people(let people):
print("✅ 선택된 사람: \(people.name)")
detailVC = PeopleDetatilViewController(peopleID: people.id)
}
// ✅ 현재 navigationController가 nil인지 확인 후 push
if let navController = self.navigationController {
navController.pushViewController(detailVC, animated: true)
} else {
print("❌ navigationController가 없음! present로 대체")
present(UINavigationController(rootViewController: detailVC), animated: true)
}
}
🔹 🚀 위 코드에서 핵심 포인트
1️⃣ navigationController가 존재하는지 확인 (self.navigationController)
2️⃣ 네비게이션이 존재하면 pushViewController() 사용
3️⃣ 네비게이션이 없으면 present()를 사용하여 UINavigationController로 감싸서 보여줌
✅ 2. presentingViewController?.navigationController?.pushViewController()
presentingViewController?.navigationController?.pushViewController()를 사용하여 상위 뷰 컨트롤러의 네비게이션 컨트롤러를 찾아서 pushViewController() 실행
extension SearchResultViewController: UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
guard let selectedCategory = dataSource?.itemIdentifier(for: indexPath) else { return }
let detailVC: UIViewController
switch selectedCategory {
case .movie(let movie):
let contentID = movie.id
detailVC = DetailViewController(contentID: contentID, contentType: .movie)
//navigationController?.pushViewController(detailVC, animated: true)
case .tv(let tv):
let contentID = tv.id
detailVC = DetailViewController(contentID: contentID, contentType: .tv)
//navigationController?.pushViewController(detailVC, animated: true)
case .people(let people):
let contentID = people.id
detailVC = PeopleDetatilViewController(peopleID: contentID)
//navigationController?.pushViewController(detailVC, animated: true)
}
// ✅ 현재 navigationController가 nil인지 확인 후 push
if let navController = self.navigationController {
navController.pushViewController(detailVC, animated: true)
} else {
print("❌ navigationController가 없음! present로 대체")
//present(UINavigationController(rootViewController: detailVC), animated: true)
presentingViewController?.navigationController?.pushViewController(detailVC, animated: true)
}
}
}
✅ 왜 presentingViewController?.navigationController?.pushViewController()는 동작하는가?
🔥 핵심 이유
👉 SearchResultViewController는 UISearchController의 searchResultsController이기 때문에 navigationController가 없음
👉 하지만, SearchViewController는 탭바 컨트롤러(MainTabBarController)에 UINavigationController로 감싸져 있음
👉 따라서 presentingViewController를 통해 SearchViewController의 navigationController를 찾아서 pushViewController()를 실행하면 정상 동작
👉 기존 네비게이션 흐름을 유지하고 싶다면? ✅ presentingViewController?.navigationController?.pushViewController(detailVC, animated: true)
'Project > MovieClip' 카테고리의 다른 글
👤 Firebase에 이메일 & 비밀번호 회원가입 기능 (MVVM + Combine) (0) | 2025.02.26 |
---|---|
🌟 회원 가입 화면 뷰 관리? 순서?는 어떻게 해야하나? (0) | 2025.02.26 |
🔨 검색결과 내의 영화, 티비의 장르 가져오는 부분 개선 (0) | 2025.02.24 |
🔥 MVVM + Combine을 통한 검색기능 구현 2편 구현 순서? (0) | 2025.02.24 |
🤔 createDataSource() 메서드에서 "검색 결과 전체보기" 버튼 동작 (0) | 2025.02.24 |