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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

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

Swift

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

Q&A

解決済

1回答

2447閲覧

TableViewCellの中身が勝手に編集されてしまう現象

nasutaro211

総合スコア21

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/04/14 03:30

tableViewCellの中にあるボタンを押すと、そのtableViewCellのなかにあるtextView.textの値を変えるプログラムを以下のように書いたのですが、選択したtableViewCell以外のtableViewCellのなかにあるtexttView.textの値も一緒に変わってしまうことがあります。どこでこのようなことが起こっているのかが全く見当がつかないのでわかる方いたら教えてください。

//tableViewCellのクラス class TableViewCell: UITableViewCell { //変えたいtextView @IBOutlet var textView: UITextView! //このボタンを押すと変わる(cellForRowAtでここのボタンにtagをつける) @IBOutlet var changeTextButton: UIButton! } //viewControllerのクラス class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{ //表示させたい文字配列 let texts = ["a","b","c","d","e","f","g","h","i","j","k","l","n","m"] /*viewDidRoadなど省略tableView.delegate、tableView.dataSorceはselfにしている*/ //cellの数 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return texts.count } //cellを返す func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { //cellを宣言 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell //textViewのtextを初期値に変更 cell.textView.text = "ボタンを押してね" //ボタンにtag付け cell.changeTextButton.tag = indexPath.row //cellを返す return cell } } //storyBoardにあるcellからActionで紐付け。textViewのtextを変える @IBAction func changeText(_ sender: Any) { let button = sender as! UIButton let indexPath = IndexPath(row: button.tag, section: 0) let cell = tableView.cellForRow(at: indexPath) as! TableViewCell //代入して指定した番号のcellのtextViewのtextを変えると他のcellのtextViewのtextも変わる(全てではなくいくつかが変わる) cell.textView.text = texts[indexPath.row] } }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/04/14 04:03

セルの再利用で調べてみてはどうでしょうか?
guest

回答1

0

ベストアンサー

UITableViewはセルを使いまわすので、値を変えたセル以外のtextも変わってしまいます。
tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)関数中で、「このセルは値を変えてあるセルだよ!」ということを教えてあげなければいけません。
拙くて申し訳ないですが、サンプルコードを書かせていただきました。
エラーが出てしまったらごめんなさい。

Swift

1//tableViewCellのクラス 2class TableViewCell: UITableViewCell { 3 //変えたいtextView 4 @IBOutlet var textView: UITextView! 5 //このボタンを押すと変わる(cellForRowAtでここのボタンにtagをつける) 6 @IBOutlet var changeTextButton: UIButton! 7} 8 9//viewControllerのクラス 10class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{ 11 //表示させたい文字配列 12 let texts = ["a","b","c","d","e","f","g","h","i","j","k","l","n","m"] 13 14 var editedCell:Int! 15 16 /*viewDidRoadなど省略tableView.delegate、tableView.dataSorceはselfにしている*/ 17 18 //cellの数 19 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 20 return texts.count 21 } 22 //cellを返す 23 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 24 //cellを宣言 25 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell 26 //textViewのtextを初期値に変更 27 28 if let editedCellIndexPathRow = editedCell { 29 //編集されたセル 30 cell.textView.text = texts[editedCellIndexPathRow.row] 31 } else { 32 cell.textView.text = "ボタンを押してね" 33 } 34 35 //ボタンにtag付け 36 cell.changeTextButton.tag = indexPath.row 37 //cellを返す 38 return cell 39 } 40} 41 //storyBoardにあるcellからActionで紐付け。textViewのtextを変える 42 @IBAction func changeText(_ sender: Any) { 43 let button = sender as! UIButton 44 let indexPath = IndexPath(row: button.tag, section: 0) 45 let cell = tableView.cellForRow(at: indexPath) as! TableViewCell 46 //代入して指定した番号のcellのtextViewのtextを変えると他のcellのtextViewのtextも変わる(全てではなくいくつかが変わる) 47 cell.textView.text = texts[indexPath.row] 48 49 //編集されたセルを記録する 50 editedCell = indexPath.row 51 } 52}

投稿2018/05/17 07:58

takoikatakotako

総合スコア45

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問