現状
TableViewにsearchBarを設置して文字を入力するとそれに応じてAPIから検索結果を受け取り
TableViewに表示してますが、Searchbarがスクロール時に上部から無くなりCellの数分スクロールが
終わった下部に出てしまいます。
Headerを使ったりSearchBarController(?)に定義したりなどあると思うのですが
今の環境だとベストなものは何でしょうか?
入力してenterを押す前は上部にあり
enterを押してcellに情報が入ると下にスクロールした最下部に留まってしまいます。
再度文字を検索しても変わりません。
import UIKit import PKHUD class MovieSearchViewController: UIViewController, UISearchBarDelegate { @IBOutlet weak var table: UITableView! @IBOutlet weak var search: UISearchBar! @IBOutlet weak var indicater: UIActivityIndicatorView! private var items:[MovieItem] = [MovieItem]() var alertController: UIAlertController! override func viewDidLoad() { super.viewDidLoad() self.setupTable() self.setupNavigationBackground() } } //エラーアラート func alert(title:String, message:String) { alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) present(alertController, animated: true) } //SearchButtounClicked func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { view.endEditing(true) fechData() } func fechData(){ search.resignFirstResponder() guard let text = search.text, !text.isEmpty else { return } guard let query = text.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { print("パーセントエンコーディング失敗") return } //LoadingAction Start HUD.show(.progress) items.removeAll() URLSession.shared.dataTask(with: URL(string: "https://api.themoviedb.org/3/search/movie?api_key=MYAPIKEY&language=ja&query=(query)&page=1")!, completionHandler: {data, response, error in guard let data = data else { print(error?.localizedDescription ?? "Unknown error") return } var result: MovieStruct? do { result = try JSONDecoder().decode(MovieStruct.self, from: data) } catch{ print("JSON perse error") } guard let finalResult = result else { return } let newMovies = finalResult.results self.items.append(contentsOf: newMovies) DispatchQueue.main.async { self.table.reloadData() //検索エラーメッセージ if newMovies.isEmpty { self.alert(title: "エラー",message: "該当する映画がありませんでした") } //LoadingAction Stop HUD.flash(.progress) } }).resume() } } extension MovieSearchViewController { private func setupTable() { table.delegate = self table.dataSource = self search.delegate = self table.register(TableViewCell.nib(), forCellReuseIdentifier: TableViewCell.identifier) } func searchBarShouldEndEditing(_ searchBar: UISearchBar) -> Bool { search.text = "" search.autocapitalizationType = .none return true } } extension MovieSearchViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return items.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = table.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell cell.setcell(item: items[indexPath.row]) return cell } } extension MovieSearchViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) self.hidesBottomBarWhenPushed = true performSegue(withIdentifier: "registerControl", sender: items[indexPath.row]) self.hidesBottomBarWhenPushed = false } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "registerControl" { let nextVC:RegisterViewController = segue.destination as! RegisterViewController if let selectedMovies = sender as? MovieItem { nextVC.movie = selectedMovies } } } }
余談
SearchBarに英字入力すると一文字目が大文字から始まりますが
Search Barの先頭文字を小文字にしたい
こちらを参考に変えてみたのですが反映されません。
大文字からでも困らないので余談ですがわかる方がいらっしゃいましたら教えてもらいたいです。
TableViewの設定を含め、全体的なコードを拝見しないと何とも言い難いところかと思います。
「Searchbarがスクロール時に上部から無くなりCellの数分スクロールが終わった下部に出てしまいます」という状況も理解し難いので、このような現象がでるサンプルコードを上げていただいた方が解決が早いと思います。
ご質問から推測されるのは、TableView Cell の一つに SearchBar を配置しているように読めるのですが、実際はどのようにされているのでしょうか。
常に上部に SearchBar を固定したいのであれば、 UITableView の上辺 (topAnchor)に接するように UISearchBar をおけば良さそうに思えるのですが、それとはまた別の実装をかんがえられているのでしょうか。
コードと画像を追加しました。
TableView内にSeaarchBarを設置したのでおそらく
TableView Cell の一つに SearchBar を配置していました。
TableViewに入れた状態だと移動してしまうのはCellが再利用されて一番下に来てしまうからでしょうか?
しかし、UITableView の上辺に接するように置いてスクロールも問題なくできました。
何かベストアンサーに選ばさせていただきたいので、回答を何かご記入よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー