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

回答1件
あなたの回答
tips
プレビュー