https://softmoco.com/basics/how-to-implement-table-view-navigation.php
↑
こちらのサイトを参考に、
Table View Cellをタップしたら画面遷移して詳細内容を表示させるものを作ってます。
(これはうまくいきました。)
さらに、UISeachBarで検索機能を追加したところ、検索機能の実装はうまくいったのですが、
検索で絞り込まれたCellをタップすると、Celの内容とは別の内容で遷移されてしまいます。
(全て同じ内容で遷移されてしまう。)
該当のソースコード
swift
1override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 2 if segue.identifier == "showDetailSegue" { 3 if let indexPath = myTableView.indexPathForSelectedRow { 4 guard let destination = segue.destination as? DetailViewController else { 5 fatalError("Failed to prepare DetailViewController.") 6 } 7 8 destination.animal = animals[indexPath.row] 9 //ここが原因?? 10 } 11 } 12 } 13
試したこと
上記コード一番下の、[indexPath.row]の部分でCellを選定する為のコードが必要なのかと思い、
[indexPath.section]にしてみたりしたのですがうまくいかず、分かりません。
見当違いかもしれないので、一応全コード記載します。
ListViewController
1import UIKit 2 3@available(iOS 10.0, *) 4class ListViewController: UIViewController,UITableViewDelegate, UITableViewDataSource { 5 6 @IBOutlet weak var myTableView: UITableView! 7 @IBOutlet weak var searchBar: UISearchBar! 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 myTableView.dataSource = self 13 myTableView.delegate = self 14 searchBar.delegate = self 15 loadData() 16 } 17 18 var animals: [Animal] = [] 19 var dupList: [Animal] = [] 20 21 //画面遷移した時に表示する内容 22 func loadData() { 23 animals.append(Animal(nameJP: "ライオン", nameEN: "Lion", imageName: "001lion")) 24 animals.append(Animal(nameJP: "フクロウ", nameEN: "Owl", imageName: "002owl")) 25 animals.append(Animal(nameJP: "とり", nameEN: "Bird", imageName: "003bird")) 26 self.dupList = self.animals 27 } 28 //検索前に表示されてるままの状態からは、ちゃんと紐付けされた内容で画面遷移しますが、 29 30 //検索後に絞り込まれたCelをタップすると、全て最初の”ライオン”の内容で画面遷移してしまいます。 31 32 33 34 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 35 return self.dupList.count 36 } 37 38 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 39 40 guard let cell = myTableView.dequeueReusableCell(withIdentifier: "AnimalTableViewCell", for: indexPath) as? AnimalTableViewCell else { 41 fatalError("Dequeue failed: AnimalTableViewCell.") 42 } 43 44 cell.animalNameJPLabel.text = self.dupList[indexPath.row].nameJP 45 cell.animalNameENLabel.text = self.dupList[indexPath.row].nameEN 46 cell.animalImageView.image = UIImage(named: self.dupList[indexPath.row].imageName) 47 48 return cell 49 } 50 51 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 52 if segue.identifier == "showDetailSegue" { 53 if let indexPath = myTableView.indexPathForSelectedRow { 54 guard let destination = segue.destination as? DetailViewController else { 55 fatalError("Failed to prepare DetailViewController.") 56 } 57 destination.animal = animals[indexPath.row] 58 } 59 } 60 } 61 62 override func viewWillAppear(_ animated: Bool) { 63 if let indexPath = myTableView.indexPathForSelectedRow{ 64 myTableView.deselectRow(at: indexPath, animated: true) 65 } 66 } 67} 68 69 @available(iOS 10.0, *) 70 extension ListViewController: UISearchBarDelegate { 71 func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { 72 searchBar.text = "" 73 searchBar.endEditing(true) 74 dupList = animals 75 } 76 77 func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 78 print("search = (searchText)") 79 80 dupList = searchText.isEmpty ? animals : animals.filter({ (Animal) -> Bool in 81 return Animal.nameJP.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil 82 }) 83 84 myTableView.reloadData() 85 } 86} 87 88
DetailViewController
1import UIKit 2 3@available(iOS 10.0, *) 4class DetailViewController: UIViewController { 5 6 var animal: Animal! 7 8 @IBOutlet weak var animalImageView: UIImageView! 9 @IBOutlet weak var animalNameJPLabel: UILabel! 10 @IBOutlet weak var animalNameENLabel: UILabel! 11 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 animalImageView.image = UIImage(named: animal.imageName) 17 animalNameJPLabel.text = animal.nameJP 18 animalNameENLabel.text = animal.nameEN 19 }
Animal
1import Foundation 2 3struct Animal { 4 private(set) public var nameJP : String 5 private(set) public var nameEN : String 6 private(set) public var imageName : String 7 8 init(nameJP: String, nameEN: String, imageName: String) { 9 self.nameJP = nameJP 10 self.nameEN = nameEN 11 self.imageName = imageName 12 } 13}
昨日から調べてるのですが分からず1日経ってしまい、助けて頂きたく送らせて頂きました。
宜しくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/21 04:20