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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

解決済

1回答

225閲覧

Cellをタップしても違うページに遷移する

hik_

総合スコア42

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/03/28 12:42

前提・実現したいこと

学習のため、メモ帳アプリを作っておりSearchBarで検索出来る機能を作っているのですが、
検索結果をTableViewに表示する段階までは実装出来たのですが、検索結果のCellをタップしても、別のメモが開いてしまう状況です。

イメージ説明

該当のソースコード

import UIKit // textViewに入力された文字を格納する変数 var memoText = [String]() var honIndex = -1 class ViewController: UIViewController { // 編集のために全画面から値を受け取る var aDate: String = "" @IBOutlet weak var textView: UITextView! override func viewDidLoad() { super.viewDidLoad() // 編集のために設定 textView.text = aDate } @IBAction func setButton(_ sender: Any) { // -1は新規作成なので追加、それ以外はmemoTextを書き換え if honIndex == -1 { memoText.append(textView.text!) } else { memoText[honIndex] = textView.text! } // memoTextをUserDefaultsで保存する UserDefaults.standard.set(memoText, forKey: "memoTextKey") } }
import UIKit class TableViewController: UITableViewController,UISearchBarDelegate { @IBOutlet weak var searchBar: UISearchBar! // 検索結果を格納 var searchResult = [String]() override func viewDidLoad() { super.viewDidLoad() searchBar.delegate = self if UserDefaults.standard.object(forKey: "memoTextKey") != nil { memoText = UserDefaults.standard.object(forKey: "memoTextKey") as! [String] } } override func viewDidAppear(_ animated: Bool) { // TableView更新 tableView.reloadData() // 前画面から戻ってきたらhonIndexを初期化 honIndex = -1 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if searchBar.text != "" { return searchResult.count } else { return memoText.count } } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // cellの表示内容を設定 let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) if searchBar.text != "" { cell.textLabel!.text = "(searchResult[indexPath.row])" } else { cell.textLabel!.text = memoText[indexPath.row] } return cell } // Cellを押した時の処理 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // honIndexに押されたCell番号を格納する honIndex = indexPath.row performSegue(withIdentifier: "Segue", sender: nil) } // 検索ボタンを押した時に呼ばれる func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { self.view.endEditing(true) searchBar.showsCancelButton = true self.searchResult = memoText.filter { $0.lowercased().contains(searchBar.text!.lowercased()) } self.tableView.reloadData() } // キャンセルボタンを押した時に呼ばれる func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { searchBar.showsCancelButton = false self.view.endEditing(true) searchBar.text = "" tableView.reloadData() } // 入力開始前に呼ばれる func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool { searchBar.showsCancelButton = true return true } // ViewControllerへの引き継ぎ設定 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let vc = segue.destination as! ViewController // 新規以外 if(honIndex != -1) { vc.aDate = memoText[honIndex] } } }

試したこと

検索結果のCellをタップするとメモ一覧の一番上のメモの情報に遷移するのですが、
色々調べているとindexが関係しているかもと考え、現在indexについて調べているのですが解決には至っていない状況です。
ご教示頂けると幸いです。

補足情報(FW/ツールのバージョンなど)

XCode10

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

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

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

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

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

fuzzball

2019/03/29 02:28

渡しているテキストが、遷移先では別のテキストになってしまうのでしょうか? それとも、そもそも違うテキストを渡してしまっているということでしょうか?
hik_

2019/03/29 05:35

情報が不足しており、すみません。 渡しているテキストが、遷移先では別のテキストになってしまいます。
fuzzball

2019/03/29 06:14

「渡しているテキスト」というのは ViewController.aDate でいいですかね? ・TableViewController.prepare(for:sender:) の vc.aDate = memoText[honIndex] の下に print("tvc:", vc.aDate) を追加 ・ViewController. viewDidLoad() の先頭に print("vc:", aDate) を追加 これで実行して出力を教えて下さい。(テキストは短めなもので)
hik_

2019/03/29 06:45

朝というCellをタップしたのですが、 出力は tvc: 夜 vc: 夜 になりました。 メモ一覧の1番上のCellが夜で2番目のCellが朝なのですが、SearchBarに朝と検索して、検索結果の朝を押すと、遷移先のViewには夜と表示されてしまいます。
fuzzball

2019/03/29 06:56

>>tvc: 夜 >>vc: 夜 「夜」を渡して「夜」を受け取ってますよね? ということは「そもそも違うテキストを渡してしまっている」じゃないでしょうか?
hik_

2019/03/29 06:59

プログラミングを学習して知識が浅く、誤っていました。 申し訳ありません。 そもそも違うテキストを渡してしまっている です。
hik_

2019/03/29 07:00 編集

その場合どのような解決策があるのでしょうか? 宜しくお願いします。
fuzzball

2019/03/29 07:28

『「朝」を渡す → 「夜」が表示される』 と思っていたのが、実は、 『「夜」を渡す → 「夜」が表示される』 だったわけです。問題は TableViewController だけにあるということです。 すぐに人に聞くのではなく、一度自分で考えて下さい。 また、問題点が変わってきているので、質問の編集をおすすめします。
hik_

2019/03/29 09:45

ご回答を元に取り組んでみます。 ありがとうございます。
hik_

2019/03/30 06:01

無事SearchBarにtextが入っている場合はsearchResultの引き継ぐ方法で解決しました。 一度自分で考えてから、質問を行おうと思います。申し訳ありません。 ありがとうございました。
guest

回答1

0

自己解決

override func prepare(for segue: UIStoryboardSegue, sender: Any?)

の中に

if searchBar.text != "" { vc.aDate = searchResult[honIndex] }

を追加する事により無事解決しました。
ありがとうございました。

投稿2019/03/30 05:59

hik_

総合スコア42

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問