From 93f6f8e4b6002d250d6b6f8b0b14139c76c227b2 Mon Sep 17 00:00:00 2001 From: Felizia Bernutz Date: Sat, 1 Feb 2020 10:30:59 +0100 Subject: [PATCH] Add SearchTokenCell (WIP) --- Cineaste.xcodeproj/project.pbxproj | 4 ++ .../Storyboards/Base.lproj/Search.storyboard | 37 +++++++++- .../SearchMovies/SearchMovieDataSource.swift | 68 ++++++++++++++++--- ...oviesViewController+SearchController.swift | 12 ++++ .../SearchMoviesViewController.swift | 2 + .../SearchMovies/SearchTokenCell.swift | 22 ++++++ 6 files changed, 136 insertions(+), 9 deletions(-) create mode 100644 Cineaste/ViewController/SearchMovies/SearchTokenCell.swift diff --git a/Cineaste.xcodeproj/project.pbxproj b/Cineaste.xcodeproj/project.pbxproj index 6f5af700..b2e2a65b 100644 --- a/Cineaste.xcodeproj/project.pbxproj +++ b/Cineaste.xcodeproj/project.pbxproj @@ -59,6 +59,7 @@ 3F7ABD5620F5C71E004B069E /* String+Locale.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F941B6C20F527E5008A4407 /* String+Locale.swift */; }; 3F7B66C62353B81600464BCC /* ContextMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F7B66C52353B81600464BCC /* ContextMenu.swift */; }; 3F7D1D4F23D4A84900BA530F /* SearchMovieDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F7D1D4E23D4A84900BA530F /* SearchMovieDataSource.swift */; }; + 3F7D1D5123D4AEB400BA530F /* SearchTokenCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F7D1D5023D4AEB400BA530F /* SearchTokenCell.swift */; }; 3F8065BC238AE3220087D6EA /* DateFormatter+Cineaste.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F8065BB238AE3220087D6EA /* DateFormatter+Cineaste.swift */; }; 3F80F27222359E5C007E03C5 /* UIView+SlideIn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F80F27122359E5C007E03C5 /* UIView+SlideIn.swift */; }; 3F85488A21039778007A322E /* IndexPath+Last.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F85488821039778007A322E /* IndexPath+Last.swift */; }; @@ -252,6 +253,7 @@ 3F75665B2381737E007E2DE8 /* UIViewController+ShareMovie.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+ShareMovie.swift"; sourceTree = ""; }; 3F7B66C52353B81600464BCC /* ContextMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenu.swift; sourceTree = ""; }; 3F7D1D4E23D4A84900BA530F /* SearchMovieDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchMovieDataSource.swift; sourceTree = ""; }; + 3F7D1D5023D4AEB400BA530F /* SearchTokenCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchTokenCell.swift; sourceTree = ""; }; 3F8065BB238AE3220087D6EA /* DateFormatter+Cineaste.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DateFormatter+Cineaste.swift"; sourceTree = ""; }; 3F80F27122359E5C007E03C5 /* UIView+SlideIn.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+SlideIn.swift"; sourceTree = ""; }; 3F83BE771FF39DFC00E584E9 /* Instantiable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Instantiable.swift; sourceTree = ""; }; @@ -601,6 +603,7 @@ 6409298F22DBAB0C0011AB96 /* SearchMoviesViewController+SwipeHint.swift */, 3FD722CB20264B720046DEAC /* SearchMoviesViewController+UITableView.swift */, 3FD722CD20264BF80046DEAC /* SearchMoviesViewController+Webservice.swift */, + 3F7D1D5023D4AEB400BA530F /* SearchTokenCell.swift */, ); path = SearchMovies; sourceTree = ""; @@ -1089,6 +1092,7 @@ 3FF095D5210325D100ADFB86 /* SettingsViewController+UIDocumentPicker.swift in Sources */, 3FF7910220DE274A007B7D37 /* SettingsCell.swift in Sources */, 3FF7910420DE274A007B7D37 /* SettingsDetailViewController.swift in Sources */, + 3F7D1D5123D4AEB400BA530F /* SearchTokenCell.swift in Sources */, 4ED2FC7D22666D89007BDE06 /* CoreDataMigrator.swift in Sources */, 3F0C1D1322A4395E00F0F52A /* ShortcutIdentifier.swift in Sources */, 3FF7910620DE274A007B7D37 /* Model.xcdatamodeld in Sources */, diff --git a/Cineaste/Storyboards/Base.lproj/Search.storyboard b/Cineaste/Storyboards/Base.lproj/Search.storyboard index 0e6deab4..f0d97f78 100644 --- a/Cineaste/Storyboards/Base.lproj/Search.storyboard +++ b/Cineaste/Storyboards/Base.lproj/Search.storyboard @@ -130,6 +130,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -166,7 +201,7 @@ - + diff --git a/Cineaste/ViewController/SearchMovies/SearchMovieDataSource.swift b/Cineaste/ViewController/SearchMovies/SearchMovieDataSource.swift index 3a9db9f0..8827fdc2 100644 --- a/Cineaste/ViewController/SearchMovies/SearchMovieDataSource.swift +++ b/Cineaste/ViewController/SearchMovies/SearchMovieDataSource.swift @@ -9,27 +9,79 @@ import UIKit class SearchMovieDataSource: NSObject, UITableViewDataSource { + enum Mode { + case discover + case manualSearch + } + var mode: Mode = .discover var movies: [Movie] = [] var currentPage: Int? var totalResults: Int? + func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + guard mode == .manualSearch else { return nil } + + switch section { + case .tokens: + return "Genres" + case .movies: + return "Movies" + default: + return nil + } + } + + func numberOfSections(in tableView: UITableView) -> Int { + switch mode { + case .discover: + return 1 + case .manualSearch: + return 2 + } + } + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - movies.count + switch (mode, section) { + case (.discover, _), + (.manualSearch, .movies): + return movies.count + case (.manualSearch, .tokens): + return 1 + default: + return 0 + } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell: SearchMoviesCell = tableView.dequeueCell(identifier: SearchMoviesCell.identifier) - let movie = movies[indexPath.row] + switch (mode, indexPath.section) { + case (.discover, _), + (.manualSearch, .movies): + let cell: SearchMoviesCell = tableView.dequeueCell(identifier: SearchMoviesCell.identifier) + + let movie = movies[indexPath.row] - cell.configure(with: movie) + cell.configure(with: movie) - if let numberOfMovies = totalResults, - indexPath.isLast(of: numberOfMovies) { - tableView.tableFooterView = UIView() + if let numberOfMovies = totalResults, + indexPath.isLast(of: numberOfMovies) { + tableView.tableFooterView = UIView() + } + + return cell + case (.manualSearch, .tokens): + let cell: SearchTokenCell = tableView.dequeueCell(identifier: SearchTokenCell.identifier) + cell.configure() + return cell + default: + fatalError("The impossible has happened") } - return cell } } + +private extension Int { + static let tokens = 0 + static let movies = 1 +} diff --git a/Cineaste/ViewController/SearchMovies/SearchMoviesViewController+SearchController.swift b/Cineaste/ViewController/SearchMovies/SearchMoviesViewController+SearchController.swift index 831de0e1..b0e0040c 100644 --- a/Cineaste/ViewController/SearchMovies/SearchMoviesViewController+SearchController.swift +++ b/Cineaste/ViewController/SearchMovies/SearchMoviesViewController+SearchController.swift @@ -24,6 +24,18 @@ extension SearchMoviesViewController: UISearchControllerDelegate { } } +extension SearchMoviesViewController: UITextFieldDelegate { + func textFieldDidBeginEditing(_ textField: UITextField) { + dataSource.mode = .manualSearch + tableView.reloadData() + } + + func textFieldDidEndEditing(_ textField: UITextField) { + dataSource.mode = .discover + tableView.reloadData() + } +} + extension SearchMoviesViewController: UISearchResultsUpdating { internal func updateSearchResults(for searchController: UISearchController) { searchDelayTimer?.invalidate() diff --git a/Cineaste/ViewController/SearchMovies/SearchMoviesViewController.swift b/Cineaste/ViewController/SearchMovies/SearchMoviesViewController.swift index a3c6c819..fd03b92b 100644 --- a/Cineaste/ViewController/SearchMovies/SearchMoviesViewController.swift +++ b/Cineaste/ViewController/SearchMovies/SearchMoviesViewController.swift @@ -140,6 +140,8 @@ class SearchMoviesViewController: UIViewController { navigationItem.hidesSearchBarWhenScrolling = false definesPresentationContext = true + + resultSearchController.searchBar.searchTextField.delegate = self } // MARK: - Custom functions diff --git a/Cineaste/ViewController/SearchMovies/SearchTokenCell.swift b/Cineaste/ViewController/SearchMovies/SearchTokenCell.swift new file mode 100644 index 00000000..cb545d23 --- /dev/null +++ b/Cineaste/ViewController/SearchMovies/SearchTokenCell.swift @@ -0,0 +1,22 @@ +// +// SearchTokenCell.swift +// Cineaste App +// +// Created by Felizia Bernutz on 19.01.20. +// Copyright © 2020 spacepandas.de. All rights reserved. +// + +import UIKit + +class SearchTokenCell: UITableViewCell { + static let identifier = "SearchTokenCell" + + @IBOutlet weak var tokenIcon: UIImageView! + @IBOutlet weak var title: UILabel! + + func configure() { + tokenIcon.image = UIImage.searchIcon + title.text = "Horror" + } + +}