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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

1062閲覧

Xcode TableView CustomCellで検索機能の付け方

LATA-apple

総合スコア3

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/04/02 08:43

編集2021/04/02 08:48

前提・実現したいこと

TableViewでXibを使用してCustomCellを作っているのですが、検索機能をつけたいと思い、実装しようと思いましたがうまくいかなかったので解決方法を教えて頂きたいです。
データ→ name 、 date
nameを検索(フィルター)して検索結果を表示するのですが、nameに対応するdateを表示したいです。
独学でプログラミングを始めたのでわかりやすく解決方法を教えてくださると嬉しいです。

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

なし

該当のソースコード(ViewController.swift)

※文字数制限のためname、name1、name2、name3、date、date1、date2、date3の項目の数を減らしています。

swift

1import UIKit 2 3class ProductdateViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate { 4 @IBOutlet var tableview: UITableView! 5 @IBOutlet var segmentedControl: UISegmentedControl! 6 @IBOutlet var chenge: UIBarButtonItem! 7 @IBOutlet var search: UISearchBar! 8 9 let feedbackimpact = UIImpactFeedbackGenerator(style: .rigid) 10 11 // MARK: - all 12 var name = ["iPhone","iPhone 3G","iPhone 3GS"] 13 14 var date = ["2007/06/29 (金)","2008/07/11 (金)","2009/06/26 (金)"] 15 16 // MARK: - Product 17 var name1 = ["iPhone","iPhone 3G","iPhone 3GS"] 18 var date1 = ["2007/06/29 (金)","2008/07/11 (金)","2009/06/26 (金)"] 19 20 // MARK: - OS 21 var name2 = ["iOS 14","iPadOS 14","watchOS 7"] 22 var date2 = ["2020/09/17 (木)","2020/09/17 (木)","2020/09/17 (木)"] 23 24 // MARK: - BetaOS 25 var name3 = ["iOS 14.2 beta","iPadOS 14.2 beta","macOS 11 beta7"] 26 var date3 = ["2020/09/18 (金)","2020/09/18 (金)","2020/09/18 (金)"] 27 28 29 30 var SegmentNumber = "" 31 32 var searchResults:[String] = [] 33 34 override func viewDidLoad() { 35 super.viewDidLoad() 36 tableview.dataSource = self 37 tableview.delegate = self 38 search.delegate = self 39 if let cancelButton = search.value(forKey: "cancelButton") as? UIButton { 40 cancelButton.setTitle("キャンセル", for: UIControl.State.normal) 41 } 42 SegmentNumber = "0" 43 feedbackimpact.prepare() 44 45 name.reverse() 46 date.reverse() 47 name1.reverse() 48 date1.reverse() 49 name2.reverse() 50 date2.reverse() 51 name3.reverse() 52 date3.reverse() 53 // Do any additional setup after loading the view. 54 55 tableview.register(UINib(nibName: "ProductdateTableViewCell", bundle: nil), forCellReuseIdentifier: "ProductdateTableViewCell") 56 } 57 58 @IBAction func segnum(_ sender: Any) { 59 if (segmentedControl.selectedSegmentIndex == 0) { 60 SegmentNumber = "0" 61 } else if (segmentedControl.selectedSegmentIndex == 1) { 62 SegmentNumber = "1" 63 } else if (segmentedControl.selectedSegmentIndex == 2) { 64 SegmentNumber = "2" 65 } else if (segmentedControl.selectedSegmentIndex == 3) { 66 SegmentNumber = "3" 67 } 68 tableview.reloadData() 69 } 70 71 @IBAction func chengeaction(_ sender: Any) { 72 feedbackimpact.impactOccurred() 73 if SegmentNumber == "0" { 74 name.reverse() 75 date.reverse() 76 } else if SegmentNumber == "1" { 77 name1.reverse() 78 date1.reverse() 79 } else if SegmentNumber == "2" { 80 name2.reverse() 81 date2.reverse() 82 } else if SegmentNumber == "3" { 83 name3.reverse() 84 date3.reverse() 85 } 86 tableview.reloadData() 87 } 88 89 //テキストフィールドに入力された文字をリアルタイムに検索 90 func searchBar(_ searchBar: UISearchBar,textDidChange searchText: String) { 91 if SegmentNumber == "0" { 92 self.searchResults = name.filter{ 93 // 大文字と小文字を区別せずに検索 94 $0.lowercased().contains(search.text!.lowercased()) 95 } 96 }else if SegmentNumber == "1" { 97 self.searchResults = name1.filter{ 98 // 大文字と小文字を区別せずに検索 99 $0.lowercased().contains(search.text!.lowercased()) 100 } 101 }else if SegmentNumber == "2" { 102 self.searchResults = name2.filter{ 103 // 大文字と小文字を区別せずに検索 104 $0.lowercased().contains(search.text!.lowercased()) 105 } 106 }else if SegmentNumber == "3" { 107 self.searchResults = name3.filter{ 108 // 大文字と小文字を区別せずに検索 109 $0.lowercased().contains(search.text!.lowercased()) 110 } 111 } 112 self.tableview.reloadData() 113 } 114 115 // 検索ボタンが押された時に呼ばれる 116 func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 117 self.view.endEditing(true) 118 if SegmentNumber == "0" { 119 self.searchResults = name.filter{ 120 // 大文字と小文字を区別せずに検索 121 $0.lowercased().contains(search.text!.lowercased()) 122 } 123 }else if SegmentNumber == "1" { 124 self.searchResults = name1.filter{ 125 // 大文字と小文字を区別せずに検索 126 $0.lowercased().contains(search.text!.lowercased()) 127 } 128 }else if SegmentNumber == "2" { 129 self.searchResults = name2.filter{ 130 // 大文字と小文字を区別せずに検索 131 $0.lowercased().contains(search.text!.lowercased()) 132 } 133 }else if SegmentNumber == "3" { 134 self.searchResults = name3.filter{ 135 // 大文字と小文字を区別せずに検索 136 $0.lowercased().contains(search.text!.lowercased()) 137 } 138 } 139 self.tableview.reloadData() 140 } 141 142 // キャンセルボタンが押された時に呼ばれる 143 func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { 144 self.view.endEditing(true) 145 search.text = "" 146 self.tableview.reloadData() 147 } 148 149 // テキストフィールド入力開始前に呼ばれる 150 func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool { 151 return true 152 } 153 154 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 155 return 40 156 } 157 158 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 159 if search.text != "" { 160 return searchResults.count 161 } else if SegmentNumber == "0" { 162 return name.count 163 } else if SegmentNumber == "1" { 164 return name1.count 165 } else if SegmentNumber == "2" { 166 return name2.count 167 } else if SegmentNumber == "3" { 168 return name3.count 169 }else { 170 return 0 171 } 172 } 173 174 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 175 ///セルの構築 176 let cell = tableview.dequeueReusableCell(withIdentifier: "ProductdateTableViewCell", for: indexPath as IndexPath) as! ProductdateTableViewCell 177 //セルのテキストラベルにindexPath.row番目の配列の要素を入れる 178 if search.text != "" { 179 cell.name.text = searchResults[indexPath.row] 180 //cell.date.text = 181 } else if SegmentNumber == "0" { 182 cell.name.text = name[indexPath.row] 183 cell.date.text = date[indexPath.row] 184 } else if SegmentNumber == "1" { 185 cell.name.text = name1[indexPath.row] 186 cell.date.text = date1[indexPath.row] 187 } else if SegmentNumber == "2" { 188 cell.name.text = name2[indexPath.row] 189 cell.date.text = date2[indexPath.row] 190 } else if SegmentNumber == "3" { 191 cell.name.text = name3[indexPath.row] 192 cell.date.text = date3[indexPath.row] 193 } else { 194 cell.name.text = nil 195 cell.date.text = nil 196 } 197 //複数行の文章を表示 198 cell.textLabel?.numberOfLines=0 199 //UITableViewCell型を返す 200 return cell 201 } 202 203 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 204 205 //画面が表示された時にハイライトを消す(ハイライトが徐々に消える) 206 if let indexPathForSelectedRow = tableview.indexPathForSelectedRow { 207 tableview.deselectRow(at: indexPathForSelectedRow, animated: true) 208 } 209 } 210 211 /* 212 // MARK: - Navigation 213 214 // In a storyboard-based application, you will often want to do a little preparation before navigation 215 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 216 // Get the new view controller using segue.destination. 217 // Pass the selected object to the new view controller. 218 } 219 */ 220 221} 222

該当のソースコード(TableViewCell.swift)

Swift

1import UIKit 2 3class ProductdateTableViewCell: UITableViewCell { 4 @IBOutlet var name: UILabel! 5 @IBOutlet var date: UILabel! 6 7 override func awakeFromNib() { 8 super.awakeFromNib() 9 // Initialization code 10 } 11 12 override func setSelected(_ selected: Bool, animated: Bool) { 13 super.setSelected(selected, animated: animated) 14 15 // Configure the view for the selected state 16 } 17 18} 19

試したこと

検索してみましたがCustomCellで検索している記事が見つからず、現在に至ります。

イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/04/02 22:12

name と date が別々の配列になのがいけてないと思うので、Productdate 構造体を作れば良いのでは。
LATA-apple

2021/04/04 03:36

了解です。構造体で組んでみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問