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

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

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

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

Swift

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

Q&A

解決済

1回答

1569閲覧

TableViewCellにTextFieldを設定した場合のリユーズセルのTextFieldに最初に入力したデータが表示される問題

otto-papa

総合スコア11

iOS

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

Swift

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

0グッド

0クリップ

投稿2016/11/23 17:59

テーブルビューセルにテキストフィールドを設定して文字入力できるように、ウェブ上のサンプルコードを使用してアプリを作りましたが、セルの数を増やして(図1)のように順番に入力していくと(図2)のように、0番目のセルに入力した内容が、リユーズセルのテキストフィールドに表示されてしまいます。

(図1)
イメージ説明

(図2)
イメージ説明

また、そのまま続けて入力して行って(図3)のようにデータを上書きして、0番目のセルに戻ってみると(図4)のように0番目のセルのテキストフィールドデータも書き換わってしまします。

(図3)
イメージ説明

(図4)
イメージ説明

リユーズされるので当然といえば当然で、どのようなメソッドあるいはプロパティを追加すればリユーズセルのテキストフィールドに最初のデータを表示しないようにできるのか、リユーズセルのテキストフィールドデータを書き換えた場合、最初のテーブルセルのテキストフィールドデータが書き変わらないようにできるのか全く行き詰まってしまって分からない状況です。プログラムは以下のように記述しており、もしわかる方がおられればご享受いただければ幸いです。宜しくお願い致します。

<ViewController.swift>の記述

ViewController.swift

1import UIKit 2 3class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, InputTextTableCellDelegate { 4 5 @IBOutlet weak var tableView: UITableView! 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 // Do any additional setup after loading the view, typically from a nib. 10 } 11 12 13 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 14 return 15 15 } 16 17 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 18 let cell: InputTextTableCell = 19 tableView.dequeueReusableCell(withIdentifier: "InputTextCell", for: indexPath as IndexPath) as! InputTextTableCell 20 cell.delegate = self 21 return cell 22 } 23 24 func textFieldDidEndEditing(cell: InputTextTableCell, Value: NSString) -> () { 25 } 26 27 override func didReceiveMemoryWarning() { 28 super.didReceiveMemoryWarning() 29 // Dispose of any resources that can be recreated. 30 } 31 32}

Protocol<InputTextTableCell.swift>の記述

InputTextTableCell.swift

1import UIKit 2 3protocol InputTextTableCellDelegate { 4 func textFieldDidEndEditing(cell:InputTextTableCell, Value:NSString) -> () 5} 6 7class InputTextTableCell: UITableViewCell, UITextFieldDelegate { 8 9 10 @IBOutlet weak var inputTextField: UITextField! 11 @IBOutlet weak var inputTextField2: UITextField! 12 13 var delegate: InputTextTableCellDelegate! = nil 14 15 override func awakeFromNib() { 16 super.awakeFromNib() 17 // Initialization code 18 inputTextField.delegate = self 19 inputTextField2.delegate = self 20 } 21 22 override func setSelected(_ selected: Bool, animated: Bool) { 23 super.setSelected(selected, animated: animated) 24 25 // Configure the view for the selected state 26 } 27 28 static func height() -> CGFloat { 29 return 75 30 } 31 32 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 33 if textField.tag == 1{ 34 inputTextField2.becomeFirstResponder() 35 }else{ 36 textField.resignFirstResponder() 37 } 38 return true 39 } 40 41 func textFieldDidEndEditing(_ textField: UITextField) { 42 self.delegate!.textFieldDidEndEditing(cell: self, Value: textField.text! as NSString) 43//AppDelegateの配列にデータを追加 44 let appDelegate = UIApplication.shared.delegate as! AppDelegate 45 if textField.tag % 2 != 0 { 46 appDelegate.dataArray1.append(textField.text!) 47 print("配列1 = \(appDelegate.dataArray1)") 48 }else{ 49 appDelegate.dataArray2.append(textField.text!) 50 print("配列2 = \(appDelegate.dataArray2)") 51 } 52 } 53}

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

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

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

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

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

guest

回答1

0

ベストアンサー

tableView(_:cellForRowAt:)の中でテキストフィールドを初期化してやればいいです。

投稿2016/11/23 23:48

fuzzball

総合スコア16731

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

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

otto-papa

2016/11/24 06:26

fuzzballさんありがとうございます。 私の知識不足で、InputTextTableCellクラスにOutlet接続した変数(inputTextFieldとinputTextfield2)のプロパティ(.text)をViewControllerクラスで扱う方法がわからずにいたところでした。 もしよろしければそこのところをお尋ねしてもよろしいでしょうか?
fuzzball

2016/11/24 06:31

cell. inputTextField.text = "hoge"でアクセス出来ないでしょうか?
otto-papa

2016/11/24 12:06

fuzzballさんありがとうございます。そうですよね!難しく考えすぎてて気がつきませんでした。お恥ずかしい次第です。勉強になりました。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問