본문 바로가기

Project/MovieClip

❌ 문제 해결 - 검색 결과의 상세페이지 이동이 안됨..

✅ NavigationController에서 push가 안 되는 이유 & 해결 방법

🚀 현재 didSelectItemAt은 잘 호출되고 있지만, pushViewController가 동작하지 않는 문제
👉 이유: SearchResultViewControllerUISearchControllersearchResultsController로 설정되어 있어서 네비게이션 스택에 포함되지 않음!

👉 따라서 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)