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

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

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

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

Q&A

解決済

1回答

2088閲覧

隠れているUITableViewから値を取得したい

hkbto

総合スコア14

Swift

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

0グッド

0クリップ

投稿2020/01/10 15:09

UITableViewに動的にセルを増やし、ボタンを押したタイミングで増やしたセル全てから情報を取得するということをやりたいのですが、うまく行きません。
現状のソースではFatal error: Unexpectedly found nil while unwrappingが出てしまいます。
調べたところだと、TableView.cellForRowでは画面上隠れてしまっている箇所のセルはnilが返却されてしまうため、セルを増やしすぎるとスクロールビューによって一部が隠れてしまい、そこの値が取得できずにエラーが起きているみたいなのですが、何かいい方法はありませんか?

Swift

1 2 var saveList: NSMutableArray = [] 3 for i in 0..<tmpList.count { 4 let ndx = IndexPath(row:i, section: 0) 5 let cell = TableView.cellForRow(at:ndx) as! customCells 6 let txt = cell.Text.text 7 8 } 9 saveList.add(txt!)

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/01/10 16:18

cellはモデルの値の表示を担当しているだけだと思いますので、元データを持っているモデル(配列?)があればそこから値を取得できないでしょうか?
hkbto

2020/01/11 00:24 編集

cellはUITextFieldを持っていて編集可能なのですが、編集のイベントハンドリングをして元データを更新更新していくしかないのでしょうか? その場合、何番目のセルを編集したかの情報はどのように取得できるのでしょうか?
guest

回答1

0

ベストアンサー

諦めたほうがよいです。
それはUITableViewの誤った使い方であり、うまくいきません。UITableViewは表示するセルだけを保持し、画面の外に出たセルはすぐ捨てます。一旦画面の外にでたら、次回表示するときはまた新しく作りなおします。

tyobigorouさんの質問が、正しい解決策を示しています。

UITableViewは表示するためのものです。UITableViewDataSourceProtocolによりUITableViewに表示すべき内容(=データソース)を与えて使います。この与える元情報がモデルです。意識していなくても、このモデル部分は必ず存在します。tableview(_:cellForRowAt)の中で、作成したUITableViewCellに情報を与えている元がそれです。

動的に増やすとき、モデルを更新しているはずです。ボタンを押した時に、モデルから情報を取れば、セルからとりだす必要はないはずです。もし、セルにしか情報を持たせていないなら、モデルに持たせるように変えましょう。

投稿2020/01/10 21:25

eytyet

総合スコア803

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

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

hkbto

2020/01/11 00:25 編集

cellはUITextFieldを持っていて編集可能なのですが、編集のイベントハンドリングをして元データを更新更新していくしかないのでしょうか?
eytyet

2020/01/11 00:20

その通りです。セルのUITextFieldからデータを読み出すのではなくて、UITextFieldDelegateを適切に設定して、そこで呼ばれるtextFieldDidEndEditingメソッドなどでデータを取得していく必要があります。
hkbto

2020/01/11 00:26

customCell内にtextFieldDidEndEditingを設定することで編集したテキストは取得できたのですが、何番目のセルを編集したかはどのように取得できるのでしょうか?
eytyet

2020/01/11 00:34 編集

customCellということは、tableview(_:cellForRowAt)でそのカスタムセルを作っていますよね。そこではIndexPathが分かっているので、そこで、indexPath.rowをカスタムセルのテキストフィールドのtagに書いておくと、textFieldDidEndEditingの中でtagを読んで取得できます。
hkbto

2020/01/11 01:09

度々すみません。 customCell側で何番目のテキストが編集されたかは感知する事が出来たのですが、その編集結果をViewController側に渡すにはどのようにすればいいのでしょうか?
eytyet

2020/01/11 04:42

私のオススメは、シングルトンなクラスを作って、そこに情報をもたせて、ビューコントローラーからもテキストフィールドからもそこにアクセスするようにすることです。どこからでも`クラス名.shared`として同一インスタンスにアクセスできて便利です。 https://qiita.com/sachiko-kame/items/85c2b4163b05ed2cc872 こういうのをモデルクラスと言って、ほぼMVCアーキテクチャになります。 自分でシングルトンを作るのが面倒なら、AppDelegateに情報を持たせると、どこからでも`let app = UIApplication.shard.delegate as! AppDelegate`としてアクセスできるので、同じ事ができます。構造的にはイマイチですが、簡単です。 オススメはシングルトンなモデルクラスを用意することです。モデルクラスからビューコントローラーやビューへのアクセスをせず、状態の変更をNotificationなどで通知するようにしたら、立派にMVC構造になります。保守性の問題なので、やっているうちに自分がそうしたくなっていくので、そうなってからそのように変えて行ってもいいと思います。
hkbto

2020/01/11 06:16

詳しく回答していただいてありがとうございます。シングルトンなクラスを作成する方向で頑張ってみようと思います。 大変参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問