質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

解決済

Swift TableViewをSearchBarで検索したいです

gon_878
gon_878

総合スコア2

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

1回答

0評価

0クリップ

182閲覧

投稿2022/05/10 08:34

前提

「Alamofireを使用してAPIを叩き、その結果を反映したTableView」を「SearchBar」で検索する方法を教えてください

実現したいこと

画像は拾い画のサンプルですが、APIを叩いて反映させたTableViewで以下の画像と同じようなことを実現したいです。
イメージ説明

発生している問題・エラーメッセージ

ググりまくって何パターンが試したのですがsearchbarがうまく検索してくれないです。

該当のソースコード

swift

//QiitaArticleViewController(ファイル名です) import UIKit struct QiitaArticle: Codable { let title: String let url: String let user: QiitaUser } struct QiitaUser: Codable { let id: String let imageUrl: String enum CodingKeys: String, CodingKey { case id case imageUrl = "profile_image_url" } } class QiitaArticleViewController: UIViewController { @IBOutlet weak var tableView: UITableView! @IBOutlet weak var qiitaSearchBar: UISearchBar! var articles: [QiitaArticle] = [] override func viewDidLoad() { super.viewDidLoad() tableView.dataSource = self tableView.delegate = self qiitaSearchBar.delegate = self let nib = UINib(nibName: "QiitaTableViewCell", bundle: nil) tableView.register(nib, forCellReuseIdentifier: "QiitaTableViewCell") tableView.rowHeight = 90 getQiitaArticles() } } extension QiitaArticleViewController { func getQiitaArticles() { ApiClient().request { result in switch result { case.success(let articles): self.articles = articles DispatchQueue.main.async { self.tableView.reloadData() } case.failure(let error): self.showApiAlert(error: error) } } } func showApiAlert(error: APIError) { let alert = UIAlertController(title: error.errorTitle().title, message: nil, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "閉じる", style: .cancel, handler: nil)) self.present(alert, animated: true, completion: nil) } } extension QiitaArticleViewController: UITableViewDataSource,UITableViewDelegate { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return articles.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: "QiitaTableViewCell", for: indexPath) as? QiitaTableViewCell else { return UITableViewCell() } let article = articles[indexPath.row] cell.set(title: article.title, author: article.user.id, imageUrl: article.user.imageUrl) return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let storyboard = UIStoryboard(name: "WebViewController", bundle: nil) guard let webViewController = storyboard.instantiateViewController(withIdentifier: "WebViewController") as? WebViewController else { return } let article = articles[indexPath.row] webViewController.url = article.url navigationController?.pushViewController(webViewController, animated: true) } } extension QiitaArticleViewController: UISearchBarDelegate { func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {       //おそらくこの {} 内で何かするのではないかと思っています。 }
//QiitaAPI(ファイル名です) import Foundation import Alamofire struct ErrorTitle { let title: String } enum APIError: Error { case invaildURL case invaildResponce case unknown(Error) func errorTitle() -> ErrorTitle { switch self { case .invaildURL: return ErrorTitle(title: "無効なURL") case .invaildResponce: return ErrorTitle(title: "無効なレスポンス") case .unknown(let error): return ErrorTitle(title: "予期せぬエラー\(error)") } } } typealias ResultHandler<T> = (Result<T, APIError>) -> Void struct ApiClient { func request(handler: @escaping ResultHandler<[QiitaArticle]>) { let urlString = "https://qiita.com/api/v2/tags/iOS/items" guard let url = URL(string: urlString) else { handler(.failure(.invaildURL)) return } AF.request(urlString) .response { response in guard let data = response.data else { handler(.failure(.invaildResponce)) return } do { let articles = try JSONDecoder().decode([QiitaArticle].self, from: data) handler(.success(articles)) } catch { handler(.failure(.unknown(error))) } } } }
//QiitaTableViewCell(ファイル名です) class QiitaTableViewCell: UITableViewCell { @IBOutlet weak var iconImageView: UIImageView! @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var authorLabel: UILabel! func set(title: String, author: String, imageUrl: String) { Nuke.loadImage(with: URL(string: imageUrl), into: iconImageView) titleLabel.text = title authorLabel.text = author } }
//WebViewController(ファイル名です) import UIKit import WebKit enum RectSize: CGFloat{ case x = 0 case y = 50 } class WebViewController: UIViewController { var webView = WKWebView() var url: String? override func viewDidLoad() { super.viewDidLoad() let screenWidth:CGFloat = view.frame.size.width let screenHeight:CGFloat = view.frame.size.height let rect = CGRect(x: RectSize.x.rawValue, y: RectSize.y.rawValue, //ここいじる ここに関係する width: screenWidth, height: screenHeight) let configuration = WKWebViewConfiguration() webView = WKWebView(frame: rect, configuration: configuration) view.addSubview(webView) guard let url = URL(string: self.url ?? "") else { return } let request = URLRequest(url: url) webView.load(request) } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。