구현 내용
- 서치바에 영화를 검색하면 영화검색 결과가 나오고 해당 셀을 누르면 영화 상세페이지로 넘어가게 된다.
구현 코드
- 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)
}
}
}
}
}
'iOS > UIKIT' 카테고리의 다른 글
코어 데이터 사용해보기 (0) | 2024.07.11 |
---|---|
컬렉션 뷰의 아이템을 길게 눌렀을 때, 호출되는 메서드 사용하기 (0) | 2024.07.11 |
랜덤으로 영화 표시하기 (0) | 2024.07.10 |
webkit을 통해 유튜브 영상의 주소로 영상 틀어보기 (0) | 2024.07.08 |
유튜브에서 제공하는 API를 통해 영화 트레일러 가져오기 (0) | 2024.07.08 |