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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Xcode

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

Swift

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

Q&A

解決済

2回答

628閲覧

セルにdictionaryの値を渡し、表示したい。 Firestore

退会済みユーザー

退会済みユーザー

総合スコア0

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Xcode

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

Swift

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

0グッド

1クリップ

投稿2018/07/06 04:16

編集2018/07/07 14:00

ストーリーボード未使用で開発しています。

実現したいこと

UITableViewControllerのcellForRowAt内のcell.textLabel?.textの値として、
コード①のdictionary内のvalueを持たせ、セルに表示させたい。

分からない点

下記コード①をFirestoreのSetDataで保存しています。
ここのdictionary内のuserNameのvalueを、
UITableViewControllerのセルに表示したいです。

コード① Prof1です import Foundation import Firebase protocol DocumentSerializable2 { init?(dictionary:[String:Any]) } struct Prof1 { var userName :Any var dictionary:[String:Any] { return [ "userName" : (userName as AnyObject).text ?? "" ]} } extension Prof1 : DocumentSerializable2 { init?(dictionary: [String:Any]) { guard let userName = dictionary["userName"] as? Any else {return nil} self.init(userName: userName) } }

下記コード②でhoge.contentとhoge.timeStampはセルに表示できています。

この様に、コード①のuserNameも セルに表示したいのですが、
値のイニシャライズが分かりません。(let profff = Prof1()の書き方自体間違ってるかもしれませんが...)

コード② UITableViewControllerです //省略してます override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) let hoge = hogeArray[hogeArray.count - indexPath.row - 1]      //⚠️ここで値を渡したいですのですが、イニシャライズが分かりません。      let profff = Prof1() cell.textLabel?.text = "(profff.userName) (hoge.content)" cell.detailTextLabel?.text = "(hoge.timeStamp)" return cell } //省略してます

数日調べていますが、分からない為質問致します。
よろしくお願いします。

//追記

reloadDataもできています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

addSnapshotListenerviewWillAppearで呼び出すのは変わらないですよね。
それで取得できたデータからProf1を作って、その作ったProf1cell.textLabel?.textを更新するだけです。

swift

1 2  var prof1 : Prof1? 3 var dataListener : ListenerRegistration! 4 5 override func viewWillAppear(_ animated: Bool) { 6 super.viewWillAppear(animated) 7 8 let userRef = db.collection("users").document("user") 9 10 dataListener = userRef.addSnapshotListener { [unowned self] (docSnapshot, error) in 11 guard let docSnapshot = docSnapshot, docSnapshot.exists, else { return } 12 13 if let prof1 = Prof1(dictionary: docSnapshot.data()) { 14 self.prof1 = prof1 15 self.tableView.reloadData() 16 } 17 } 18 } 19 20 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 21 let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 22 23 let hoge = hogeArray[hogeArray.count - indexPath.row - 1] 24 25 if let profff = self.prof1 { 26 cell.textLabel?.text = "(profff.userName) (hoge.content)" 27 } 28 cell.detailTextLabel?.text = "(hoge.timeStamp)" 29 30 return cell 31 } 32

追記

userNameAnyだと取り出すことが出来なくなるので、普通にStringで持つようにしましょう。

swift

1struct Prof1 { 2 var userName : String 3 4 var dictionary:[String:Any] { 5 return [ 6 7 "userName" : userName 8 ]} 9} 10 11 12 13extension Prof1 : DocumentSerializable2 { 14 init?(dictionary: [String:Any]) { 15 16 guard let userName = dictionary["userName"] as? String 17 else {return nil} 18 19 self.init(userName: userName) 20 } 21}

投稿2018/07/07 15:37

編集2018/07/07 17:30
f-miyu

総合スコア1625

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

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

退会済みユーザー

退会済みユーザー

2018/07/07 16:41 編集

f-miyu様 本当にありがとうございます。表示できました。userNameの値を表示するにはListenerRegistrationは必要だったのですね お手数おかけしました。 分からない箇所があります。 Optional(Huga)と表示されてしまうのですが、Hugaだけ表示したいのでOptionalを消すにはどうすれば良いのでしょうか??
f-miyu

2018/07/07 17:31

回答に追記しました。
退会済みユーザー

退会済みユーザー

2018/07/08 04:53

SetDataの時、テキストをUITextFieldに入力してSetDataをするので、 struct Prof1のdictionaryは "userName" : (userName as AnyObject).text ?? ""としていました。 Anyではなく、Stringだとどうしても自分ではエラーを出してしまいます。
f-miyu

2018/07/08 05:30

何が問題なのかよくわからないのですが、SetDataする時でもUITextFieldのtextの値でdictionaryを作るだけだと思うのですが。
退会済みユーザー

退会済みユーザー

2018/07/08 13:46

今の所AnyでもOptional()無しで表示できていますが、 >>SetDataする時でもUITextFieldのtextの値でdictionaryを作る Stringで書けるように確認してみます。 f-miyu様 本当にありがとうございます。助かりました!
guest

0

cellForRowAtで取得したCellに対して値を渡せばいいのではないでしょうか。
addSnapshotListenerでは、取得した値をプロパティで受け取った後、reloadDataを呼び出し、テーブルの更新を行えばいいと思います。

投稿2018/07/07 07:20

f-miyu

総合スコア1625

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

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

退会済みユーザー

退会済みユーザー

2018/07/07 08:21

ありがとうございます。 UIlabelではなくCellに対して値を渡したいと思います。 >>addSnapshotListenerでは、取得した値をプロパティで受け取った後 プロパティで受け取るというのは、どういうことでしょうか??docSnapshot.data()のdata()の中でしょうか?
f-miyu

2018/07/07 08:41 編集

今回の場合、必要なデータはuserNameだけっぽいので、この値をUITableViewControllのプロパティとして持っておくということです。 このプロパティを使って、cellForRowAt時に取得できるHogeCellのUIlabelを更新します。 ちなみに、全てのセルに対して、同じuserNameを表示するということでいいんですよね?
退会済みユーザー

退会済みユーザー

2018/07/07 13:50

f-miyu様 何度も申し訳ございません。 大変恐れ入りますが、試行錯誤した結果UILabelではなく、tableviewCell内の cell.textLabel?.textに表示したいと思いました。 この質問の本文を全て書き換えました。 見ていただけないでしょうか? どうぞ、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問