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

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

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

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

Q&A

解決済

1回答

606閲覧

search bar で検索機能をつけたい

coco7777

総合スコア8

Swift

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

0グッド

0クリップ

投稿2022/10/26 02:58

search barを使って検索機能をつけて、同じ文字列を含むtableViewCellの絞り込みをしたいです。
今のコードだとsearchResult = nameArray の部分しか絞りこみができてないので
他の要素addressArray、 hyoukaArray、dateArrayなどの順番がずれてしまってnameArrayと対応してないです。
nameArrayの要素(文字列)で検索をして、それに対応するように他の配列の値も反映させたいです。
回答お願いします。

swift

1import UIKit 2 3class nikkiTableViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate{ 4 5 private let cellId = "cellId" 6 7 var addBarButtonItem:UIBarButtonItem! 8 9 var nikkiImageArray = [[UIImage]]() 10 var topImageArray = [UIImage]() 11 var nameArray = [String?]() 12 var dateArray = [String?]() 13 var hyoukaArray = [String?]() 14 var textViewArray = [String?]() 15 var addressArray = [String?]() 16 17 var searchResult = [String?]() 18 19 @IBOutlet weak var nikkiTableView: UITableView! 20 21 22 override func viewDidLoad() {super.viewDidLoad() 23 24 setupSearchBar() 25 26 addBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addBarButtonTapped(_:))) 27 addBarButtonItem.tintColor = UIColor.white 28 29 //navigationVarの右側に追加 30 self.navigationItem.rightBarButtonItem = addBarButtonItem 31 32 nikkiTableView.delegate = self 33 nikkiTableView.dataSource = self 34 35 let appearance = UINavigationBarAppearance() 36 appearance.configureWithOpaqueBackground() 37 appearance.backgroundColor = .rgb(red: 173, green: 216, blue: 230) 38 39 //標準の高さ 40 navigationItem.standardAppearance = appearance 41 //ナビゲーションバーが透過する 42 navigationItem.scrollEdgeAppearance = appearance 43 //標準の文字の大きさ 44 navigationItem.compactAppearance = appearance 45 46 let tapGesture = UITapGestureRecognizer( 47 target: self, 48 action: #selector(dismissKeyboard)) 49 view.addGestureRecognizer(tapGesture) 50 51 tapGesture.cancelsTouchesInView = false 52 53 } 54 55 func setupSearchBar(){ 56 57 if let navigationBarFrame = navigationController?.navigationBar.bounds { 58 let searchBar: UISearchBar = UISearchBar(frame: navigationBarFrame) 59 searchBar.delegate = self 60 searchBar.placeholder = "タイトルで探す" 61 searchBar.tintColor = UIColor.white 62 searchBar.keyboardType = UIKeyboardType.default 63 navigationItem.titleView = searchBar 64 navigationItem.titleView?.frame = searchBar.frame 65 66 } 67 } 68 69 @objc func dismissKeyboard() { 70 navigationItem.titleView?.endEditing(true) 71 } 72 73 func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) { 74 } 75 // 検索バーに入力があったら呼ばれる 76 func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 77 guard !searchText.isEmpty else { 78 searchResult = nameArray 79 nikkiTableView.reloadData() 80 return 81 } 82 searchResult = nameArray.filter({ nameArray -> Bool in 83 (nameArray?.lowercased().contains(searchText.lowercased()))! 84 85 }) 86 87 88 nikkiTableView.reloadData() 89 } 90 91 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 92 93 return 190 94 } 95 96 func numberOfSections(in tableView: UITableView) -> Int { 97 98 return 1 99 } 100 101 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 102 103 return searchResult.count 104 105 } 106 107 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 108 109 let cell = nikkiTableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! nikkiTableViewCell 110 111 if let c = cell as? nikkiTableViewCell { 112 113 c.dateLabel?.text = dateArray[indexPath.row] 114 c.hyoukaLabel?.text = hyoukaArray[indexPath.row] 115 c.nameLabel?.text = searchResult[indexPath.row] 116 c.topImageView.image = topImageArray[indexPath.row] 117 118 } 119 120 return cell 121 } 122 123 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 124 125 let storyboard = UIStoryboard(name: "nikkiTableView", bundle: nil) 126 let textVC = storyboard.instantiateViewController(withIdentifier: 127 "textViewController") as! textViewController 128 129 textVC.address = addressArray[indexPath.row] 130 textVC.hyouka = hyoukaArray[indexPath.row] 131 textVC.date = dateArray[indexPath.row] 132 textVC.text = textViewArray[indexPath.row] 133 textVC.imageArray = nikkiImageArray[indexPath.row] 134 textVC.name = searchResult[indexPath.row] 135 136 //値、参照渡しのコードを書く 137 navigationController?.pushViewController(textVC, animated: true) 138 //タップした後、セルの色が白色に戻る 139 tableView.deselectRow(at: indexPath, animated: true) 140 141 navigationItem.titleView?.endEditing(true) 142 } 143 144 145 @objc func addBarButtonTapped(_ sender: UIBarButtonItem) { 146 147 let hennsyuVc = storyboard?.instantiateViewController(withIdentifier: "hennsyuViewController") as! hennsyuViewController 148 149 150 hennsyuVc.callback1 = {n,d,h,t,a,i,ia in 151 self.nameArray.insert(n, at: 0) 152 self.dateArray.insert(d, at: 0) 153 self.hyoukaArray.insert(h, at: 0) 154 self.textViewArray.insert(t, at: 0) 155 self.addressArray.insert(a, at: 0) 156 self.topImageArray.insert(i, at: 0) 157 self.nikkiImageArray.insert(ia, at: 0) 158 159 print("コールバック") 160 } 161 162 navigationController?.pushViewController(hennsyuVc, animated: true) 163 164 } 165 166 override func viewWillAppear(_ animated: Bool) { 167 168 searchResult = nameArray 169 170 nikkiTableView.reloadData() 171 172 if AppState.isEdited { 173 // ③から完了をタップして戻ってきた場合は②に遷移します。 174 AppState.isEdited = false 175 176 } 177 } 178} 179 180 181class nikkiTableViewCell: UITableViewCell { 182 183 @IBOutlet weak var topImageView: UIImageView! 184 @IBOutlet weak var nameLabel: UILabel! 185 @IBOutlet weak var dateLabel: UILabel! 186 @IBOutlet weak var hyoukaLabel: UILabel! 187 188 override func awakeFromNib() { 189 super.awakeFromNib() 190 191 } 192 override func setSelected(_ selected: Bool, animated: Bool) { 193 super.setSelected(selected, animated: animated) 194 195 } 196 197}

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

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

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

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

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

coco7777

2022/10/28 07:12 編集

xg63ex2bさん 毎回ありがとうございます。 コードも見やすくてすごく勉強になります。 構造体?を配列に入れて、個別ではなくまとめて管理できるのですね。 勉強不足で申し訳ありません。 コードの内容を理解しながらやってみます!
guest

回答1

0

ベストアンサー

個別の配列ではなく、structの配列にしてみるのはいかがでしょうか。

今回の問題と直接的に関係なさそうなコードを削除したり、
少し違う部分もあるかもしれませんが、
サンプルのコードを下に書いてみます。
*雰囲気だけ見てもらえますでしょうか

swift

1import UIKit 2 3class TableViewController: UITableViewController, UISearchBarDelegate { 4 @IBOutlet weak var searchBar: UISearchBar! 5 var dataSource = [ 6 SampleEntity(name: "name1", address: "address1", hyouka: "hyouka1", date: "2022/10/01"), 7 SampleEntity(name: "name2", address: "address2", hyouka: "hyouka2", date: "2022/10/02"), 8 SampleEntity(name: "name3", address: "address3", hyouka: "hyouka3", date: "2022/10/03"), 9 SampleEntity(name: "test4", address: "address4", hyouka: "hyouka4", date: "2022/10/04"), 10 SampleEntity(name: "test5", address: "address5", hyouka: "hyouka5", date: "2022/10/05"), 11 ] 12 var searchResult = [SampleEntity]() 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 searchBar.delegate = self 16 searchResult = dataSource 17 } 18 func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 19 guard !searchText.isEmpty else { 20 searchResult = dataSource 21 tableView.reloadData() 22 return 23 } 24 searchResult = dataSource.filter({ nameArray -> Bool in 25 (nameArray.name.lowercased().contains(searchText.lowercased())) 26 }) 27 tableView.reloadData() 28 } 29 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 30 return searchResult.count 31 } 32 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 33 let cell = tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath) 34 if let c = cell as? TableViewCell { 35 c.dateLabel?.text = searchResult[indexPath.row].date 36 c.hyoukaLabel?.text = searchResult[indexPath.row].hyouka 37 c.nameLabel?.text = searchResult[indexPath.row].name 38 } 39 return cell 40 } 41} 42class TableViewCell: UITableViewCell { 43 @IBOutlet weak var nameLabel: UILabel! 44 @IBOutlet weak var dateLabel: UILabel! 45 @IBOutlet weak var hyoukaLabel: UILabel! 46} 47struct SampleEntity { 48 var name: String 49 var address: String 50 var hyouka: String 51 var date: String 52}

投稿2022/10/27 13:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問