iOS/UIKIT

검색 결과로 나온 영화 포스터를 누르면 상세페이지로 넘어가기

밤새는 탐험가89 2024. 7. 10. 00:57

 

구현 내용

  • 서치바에 영화를 검색하면 영화검색 결과가 나오고 해당 셀을 누르면 영화 상세페이지로 넘어가게 된다. 

 

 

구현 코드

 

  • SearchViewController <-> SearchResultsViewController 간에 연결을 델리게이트 패턴으로 했다. 
  • 프로토콜을 먼저 생성한다. 
  • 델리게이트 패턴을 통해 데이터를 전달한다. 
import UIKit

protocol SearchResultsViewControllerDelegate: AnyObject {
    func searchResultsViewControllerDidTapItem(_ viewModel: TitlePreviewViewModel)
}

class SearchResultsViewController: UIViewController {
    
    // MARK: Variables
    var titles: [Title] = []
    
    public weak var delegate: SearchResultsViewControllerDelegate?
    
    ... 
}

// MARK: Extensions
extension SearchResultsViewController: UICollectionViewDelegate, UICollectionViewDataSource {
    ...
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        collectionView.deselectItem(at: indexPath, animated: true)
        
        let title = titles[indexPath.row]
        let titleName = title.original_title ?? ""
        
        APICaller.shared.getMovie(with: titleName) { [weak self] result in
            switch result {
            case .success(let videoElement):
                DispatchQueue.main.async {
                    self?.delegate?.searchResultsViewControllerDidTapItem(TitlePreviewViewModel(title: title.original_title ?? "", youtubeView: videoElement, titleOverview: title.overview ?? ""))
                }
            case .failure(let error):
                print(error.localizedDescription)
            }
        }
    }
}

 

 

 

  • searchResultsViewControllerDidTapItem(_ viewModel: TitlePreviewViewModel) 메서드를 구체적으로 구현한다. 
  • resultsController.delegate = self 선언한다.
import UIKit

class SearchViewController: UIViewController {
    
    // MARK: Variables
    private var titles: [Title] = []
    ...
}

// MARK: Extensions
extension SearchViewController: UITableViewDelegate, UITableViewDataSource {
    
    ...
}

extension SearchViewController: UISearchResultsUpdating, SearchResultsViewControllerDelegate {
    
    func searchResultsViewControllerDidTapItem(_ viewModel: TitlePreviewViewModel) {
        DispatchQueue.main.async {
            let vc = TitlePreviewViewController()
            vc.configure(with: viewModel)
            self.navigationController?.pushViewController(vc, animated: true)
        }
    }
    
    func updateSearchResults(for searchController: UISearchController) {
        let searchBar = searchController.searchBar
        
        guard let keyWord = searchBar.text,
              !keyWord.trimmingCharacters(in: .whitespaces).isEmpty,
              keyWord.trimmingCharacters(in: .whitespaces).count >= 2,
              let resultsController = searchController.searchResultsController as? SearchResultsViewController else { return }
        
        resultsController.delegate = self
        
        APICaller.shared.getDiscoverMulti(with: keyWord) { result in
            DispatchQueue.main.async {
                switch result {
                case .success(let titles):
                    DispatchQueue.main.async {
                        resultsController.titles = titles
                        resultsController.searchResultsCollectionView.reloadData()
                    }
                case .failure(let error):
                    print(error.localizedDescription)
                }
            }
        }
    }
}