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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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

解決済

3回答

1196閲覧

TableViewCellの不具合

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/04/01 13:26

編集2019/04/06 05:32

前提・実現したいこと

メモアプリを作成していて作成したメモをSearchBarで検索出来る機能を作成しているのですが、
SearchBarで検索した検索結果のCellをタップして、文字を編集して保存をするとメモ一覧に戻るとCellが置き換わってしまいます。
具体的にはメモ一覧のCell3番目を検索して検索結果から編集してメモ一覧に戻るとCellの3番目が編集したテキストに変わっていて欲しいのですが、Cell3番目は編集前のテキストのままで、Cell1番目が元々あった別のテキストからCell3番目の編集したテキストに置き換わってしまっている状況です。
イメージ説明

該当のソースコード

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() print("vc:",aDate) // 編集のために設定 textView.text = aDate } @IBAction func setButton(_ sender: Any) { // -1は新規作成なので追加、それ以外はmemoTextを書き換え if honIndex == -1 { memoText.append(textView.text!) print("追加") } else { memoText[honIndex] = textView.text! print("再編集") } // memoTextをUserDefaultsで保存する UserDefaults.standard.set(memoText, forKey: "memoTextKey") } }
import UIKit // 検索結果を格納 var searchResult = [String]() class TableViewController: UITableViewController,UISearchBarDelegate { @IBOutlet weak var searchBar: UISearchBar! 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 { // SearchBarにテキストが入力されている場合は検索結果をTableViewに表示、入力されていない場合はメモ一覧(memoText)を表示する 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) } // 予定削除機能 override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { let index = indexPath.row memoText.remove(at: index) // 予定を削除した事を保存する UserDefaults.standard.set(memoText, forKey: "memoTextKey") tableView.reloadData() } // 検索ボタンを押した時に呼ばれる func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { self.view.endEditing(true) searchBar.showsCancelButton = true 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] print("tvc:", vc.aDate) } // searchBarにtextが入力されている場合searchResultを引き継ぐ if searchBar.text != "" { vc.aDate = searchResult[honIndex] } } }

試したこと

検索結果のCellをタップすると出力にTableViewControllerがメモ一覧のCell1番目をタップしていることになっていて、ViewControllerが検索結果のCellのテキストが表示されている状態です。
このことから推測ですが、SearchBarの検索結果のCellがメモ一覧のCellをタップしていることになっていて、SearchBarの検索結果を更新させたら良いのだろうか?と考え、その方向から解決策を探しているものの解決していない状況です。
ご教示頂けると幸いです。

TableViewを更新させれば良いのかと思い、

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

if searchBar.text != "" { cell.textLabel!.text = "(searchResult[indexPath.row])" tableView.reloadData()

tableVeiew.reloadData()を追加して更新しようと試しましたが、出来ませんでした。

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

Xcode10

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

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

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

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

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

guest

回答3

0

ベストアンサー

ViewControllerの
@IBAction func setButton(_ sender: Any)を以下のように変更したら、うまく行きました。
変更前

swift

1 @IBAction func setButton(_ sender: Any) { 2 3 // -1は新規作成なので追加、それ以外はmemoTextを書き換え 4 if honIndex == -1 { 5 memoText.append(textView.text!) 6 print("追加") 7 } else { 8 memoText[honIndex] = textView.text! 9 print("再編集") 10 11 } 12 13 // memoTextをUserDefaultsで保存する 14 UserDefaults.standard.set(memoText, forKey: "memoTextKey") 15 16 }

変更後

swift

1 @IBAction func setButton(_ sender: Any) { 2 3 // -1は新規作成なので追加、それ以外はmemoTextを書き換え 4 if honIndex == -1 { 5 memoText.append(textView.text!) 6 print("追加") 7 } else { 8 let index = memoText.index(where: {$0 == aDate}) 9 memoText[index!] = textView.text! 10 print("再編集") 11 12 } 13 14 // memoTextをUserDefaultsで保存する 15 UserDefaults.standard.set(memoText, forKey: "memoTextKey") 16 17 }

投稿2019/04/06 13:58

BMJr

総合スコア80

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

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

hik_

2019/04/06 14:00

ご丁寧にありがとうございます! 9日ほど手こずっていたので本当に助かります。 ありがとうございます。
guest

0

//Cellを押した時の処理
honIndex = indexPath.row

で、search bar で検索した後のindexPath.row が「常に0」になってしまうのが原因ではないでしょうか。search bar で検索をかけずにCellの3番目を選択して編集すると、きちんとCellの3番目が変わっていました。

投稿2019/04/06 13:29

BMJr

総合スコア80

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

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

hik_

2019/04/06 13:57 編集

ありがとうございます。 ご回答のhonIndex = indexPath.row の箇所を元に解決策を探ってみます。 不明な点が出たらコメントをさせて頂ければ嬉しいのですが、その際はご意見ご教示頂けますと幸いです。 宜しくお願いします。
guest

0

ご提示いただいたコードをそのまま自分のXcodeにコピペしてみました。
検索バーに"Lorem"と入れてみましたが、次の画面に遷移せず、質問者様の症状が再現できずにいます・・・。

投稿2019/04/06 10:42

BMJr

総合スコア80

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

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

hik_

2019/04/06 11:24

ご回答ありがとうございます。 流れとしては、メモ一覧にメモが3つほどある状態でCellの3番目をSearchBarに入力し確定すると、検索結果にCell3番目のがトップに表示されて、検索結果のCellをタップして編集を行い保存して、メモ一覧に戻ると症状が発生というのが詳細な流れになります。 もし上記の手順で症状が再現出来ましたらご教示頂けると幸いです。ご返信お待ちしております。 宜しくお願いします。
BMJr

2019/04/06 11:30

TableViewの右上にある「メモを作成」というボタンは、IBOutletに紐付いているでしょうか。「メモ一覧にメモが3つほどある状態」が再現できません・・・。
hik_

2019/04/06 12:16 編集

ご返信ありがとうございます。 メモを作成のボタンはIBOutletには紐付いておらず、story boardでViewControllerにSegueで画面遷移してメモを作成出来る状態です。
BMJr

2019/04/06 12:17

承知いたしました。メモを作成のボタンからViewControllerに遷移して、「ABC」とか「DEF」とか入力して戻っても、メモ一覧に表示されませんでした。
hik_

2019/04/06 12:39

ご返信ありがとうございます。 こちらの方では問題なく出来ているのですが、問題がある箇所がないか調べてみます。
BMJr

2019/04/06 13:07

ViewControllerに「保存」ボタンを入れるのを忘れていました。「保存」ボタンを入れて、@IBAction func setButton(_ sender: Any)と紐付けたところ、TableViewに表示されるようになりました。 ようやく、質問主様の症状が再現されました。 「メモ一覧のCell3番目を検索して検索結果から編集してメモ一覧に戻るとCellの3番目が編集したテキストに変わっていて欲しいのですが、Cell3番目は編集前のテキストのままで、Cell1番目が元々あった別のテキストからCell3番目の編集したテキストに置き換わってしまっている」という状況が無事に(!?)再現されました。解決策が分かりましたら、回答させて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問