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

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

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

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

Swift

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

Q&A

解決済

2回答

3313閲覧

【Swift】カスタムセルのtextfieldの値がずれる

RagnAnet1373

総合スコア69

Xcode

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

Swift

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

0グッド

0クリップ

投稿2017/05/16 00:43

###前提・実現したいこと
前回の質問がまだ解決に至っていないのですが、どうしても気になったので質問いたします。

実現したいことはカスタムセルをずらさないようにしたいです。

###発生している問題・エラーメッセージ
プログラムを実行したりしてもエラーメッセージは出ないのですが、
画面外に出ているカスタムセルのテキストフィールドに文字列を設定して
画面を上下にスクロールすると値がずれて表示される現象が起きました。

###該当のソースコード

swift

1//viewcontroller 2import UIKit 3 4class RandomController: UIViewController, UITableViewDelegate,UITableViewDataSource,UITextFieldDelegate { 5 6 7 @IBOutlet weak var tableView: UITableView! 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 //デリゲートとデータソースを設定 13 tableView.delegate = self 14 tableView.dataSource = self 15 // Do any additional setup after loading the view. 16 } 17 18 override func didReceiveMemoryWarning() { 19 super.didReceiveMemoryWarning() 20 // Dispose of any resources that can be recreated. 21 } 22 23 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 24 return 10; 25 } 26 27 func numberOfSections(in tableView: UITableView) -> Int { // sectionの数を決める 28 return 1 29 } 30 31 32 func tableView(_ tableView: UITableView, cellForRowAt indexPath:IndexPath)->UITableViewCell{ 33 let cell: InputTextTableCell = tableView.dequeueReusableCell(withIdentifier: "InputTextCell",for: indexPath) as! InputTextTableCell 34 return cell 35 } 36}

swift

1//customcell 2import UIKit 3 4class InputTextTableCell: UITableViewCell,UITextFieldDelegate { 5 6 7 @IBOutlet weak var textField: UITextField! 8 9 override func awakeFromNib() { 10 super.awakeFromNib() 11 12 textField.returnKeyType = UIReturnKeyType.done 13 textField.delegate = self 14 // Initialization code 15 } 16 17 override func setSelected(_ selected: Bool, animated: Bool) { 18 super.setSelected(selected, animated: animated) 19 20 // Configure the view for the selected state 21 } 22 23 // MARK: - UITextFieldDelegate 24 internal func textFieldShouldReturn(_ textField: UITextField) -> Bool { 25 textField.resignFirstResponder() 26 return true 27 } 28}

###試したこと
調べてみたのですが、高さ、更新の仕方などいろいろなことが書かれており、自分のはどこがバグとして参考になるのかわかりませんでした・・・。

###補足情報(言語/FW/ツール等のバージョンなど)
Swift3、Xcode8.3です。
画面イメージは以下のようになります。
画面イメージ

バグのイメージは以下になります
↓一番上
イメージ説明
↓一番下
イメージ説明
10個のセルを設置しておりますが、上下スクロールすると次のようになります。

↓一番上
イメージ説明
↓一番下(下へスクロール、上の画像以外のセルに何も入力してなかった状態です)
イメージ説明

宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

自己解決

申し訳ございません。仕様を大幅に変更したため今回の質問は締めさせていただきます。

投稿2017/06/02 04:16

RagnAnet1373

総合スコア69

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

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

0

セルは使い回されます。
使い回されたときに初期化は行われませんので、セル毎に異なる部分は都度初期化しないといけません。

今回の場合でしたら、

swift

1func tableView(_ tableView: UITableView, cellForRowAt indexPath:IndexPath)->UITableViewCell{ 2 let cell: InputTextTableCell = tableView.dequeueReusableCell(withIdentifier: "InputTextCell",for: indexPath) as! InputTextTableCell 3 4 //ここでUITextFieldのテキストを初期化しないといけない 5 6 return cell 7 }

投稿2017/05/16 00:56

fuzzball

総合スコア16731

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

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

RagnAnet1373

2017/05/16 02:19

回答ありがとうございます。 初期化を色々試行錯誤しているのですが、 単純な初期化(全テキストフィールドに「あいうえお」を入れる) cell.textField.text = "あいうえお" ということはできたのですが、使い回しで更新されるので、セルを上下スクロールしたらその初期化した状態に戻るのでこういうやり方じゃないというのはわかったのですが、都度初期化という書き方がどうしてもわからないです・・・。 勉強不足で申し訳ございません・・・。 こういう関数を使う、引数の参照をこうする、または参考になるサイトなどありましたら、ご教授いただけませんでしょうか?
fuzzball

2017/05/16 02:25

・TextFiledに入力されたテキストを保存する ・セル生成時に保存したテキストをセットする 都度初期化=生成のたびに初期化、ということです。
RagnAnet1373

2017/05/16 05:32

すいません、回答していただいたイメージは掴めたのですが、 スクリプトで書こうとするとどうしてもどう書くとその挙動のようなスクリプトになるかというイメージができず、dictionaryなど使ったスクリプトとなり 結局その場で保存生成をする常時初期化のスクリプトになってしまいました・・・。 var celltext:[String] = []//クラスの初めに宣言 //下記が初期化部分 celltext[indexPath.row] = cell.textField.text! cell.textField.text = celltext[indexPath.row] return cell どのように初期化のコードを打つと都度初期化になるのでしょうか・・・。 お力添え、ご教授のほど宜しくお願い致します。
fuzzball

2017/05/16 06:15

Dictionaryを使うのは正しいです。(Arrayでもいいですが) TextFieldの内容を保存するのは編集が終了したときですよ。 UITextFieldDelegateのtextFieldDidEndEditing(_:)で大丈夫かと。 思いつく問題点としては、編集中にスクロールさせたときでしょうか‥。 UITableViewとUITextFieldは、どっちも面倒臭いですよ。 それぞれの基本をしっかり押さえておくべきです。
RagnAnet1373

2017/05/16 06:44

なるほど・・・、textFieldDidEndEditingですね・・・。 わかりました、そのメソッドとtableview、textfieldに関してを調べてみます。 ただ、DictionaryとtextFieldDidEndEditingはViewControllerに入れておくので大丈夫でしょうか?どちらにもUITextFieldDelegateがあるものでして・・・
fuzzball

2017/05/16 06:58

>>ViewControllerに入れておくので大丈夫でしょうか? ViewControllerでいいと思います。(どちらでも出来るような気はしますが‥) 別のアプローチとして(余計なことを)書いておくと、 ・セルにはUILabelを乗せる。 ・セルをタップするとUITextFieldを表示してテキストを入力する。 こうすれば、UITextFieldが一つだけで済みます。
RagnAnet1373

2017/05/16 07:24

わかりました、そのアイデアを元にもう一度実装を頑張りたいと思います。 またわからなくなってしまった時、質問致しますので その時またご教授いただけると嬉しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問