🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Xcode

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

Swift

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

Q&A

解決済

1回答

747閲覧

Table View Cell検索からの画面遷移がうまくいかない

KYSFY

総合スコア3

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/03/21 02:04

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日経ってしまい、助けて頂きたく送らせて頂きました。

宜しくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

destination.animal = animals[indexPath.row]
destination.animal = dupList[indexPath.row]

投稿2021/03/21 04:07

errolizer

総合スコア441

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

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

KYSFY

2021/03/21 04:20

errolizerさん 解決しました、ありがとうございます。 大変助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問