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

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

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

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

Swift

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

Q&A

解決済

1回答

1307閲覧

UITableViewのcellを表示したい

sunglass

総合スコア303

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/06/17 13:18

編集2020/06/18 07:07

Cloud Firestoreからデータを取得してcellに表示したいです。

・出来ていること
コメントアウトしたTODOはcellに表示出来ています。
Cloud Firestoreからのデータ取得

・出来ていないこと
取得したデータをcellForRowAtに表示

エラー
Cannot assign value of type 'Character' to type 'String'

イメージ説明

import UIKit import Firebase import FirebaseUI import FirebaseFirestore import FirebaseFirestoreSwift class MainViewController: UIViewController, UITextFieldDelegate, UITableViewDelegate { // let TODO = ["牛乳を買う", "掃除をする", "アプリ開発の勉強をする"] //追加② var db: Firestore! var todos: [String] = []; // var titles = [String]() var textFieldString: String! @IBOutlet weak var tableView: UITableView! @IBOutlet weak var table: UITableView! @IBOutlet weak var textField: UITextField! func getSubCollection() { // [START setup] let settings = FirestoreSettings() Firestore.firestore().settings = settings // [END setup] db = Firestore.firestore() db.collection("users").document("qfkkamfkpeqp0191e92epa").collection("posts").document("subuser1") .addSnapshotListener { documentSnapshot, error in guard let document = documentSnapshot else { print("Error fetching document: (error!)") return } let todos = document.data().flatMap {$0} print(todos!.count) // switchに変更予定 if let title = todos?["title"]{ print(title) let title = title as! String // このtitleをtext型に変更してcellに渡したい type(of: title) // Expression of type 'Any.Type' is unused } /* if let content = todos?["content"]{ print(content) let content = content as! String } */ // for i in todos ?? [String : Any]() { // print(i) // } } } override func viewDidLoad() { super.viewDidLoad() textField.delegate = self getSubCollection() } override func viewWillAppear(_ animated: Bool) { self.tableView.reloadData() } @IBAction func addButton(_ sender: Any) { textFieldString = textField.text! db.collection("users").document("qfkkamfkpeqp0191e92epa").collection("posts").document("subuser1") .setData([ "title": textFieldString, "content": "なし" ]) { error in if let error = error { print("エラーが起きました") } else { print("ドキュメントが保存されました") } } } } extension MainViewController: UITableViewDataSource { // セルの数 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return todos.count } // セルの中身 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // セルを取得する let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) // セルに表示する値を設定する cell.textLabel!.text = todos[indexPath.row] return cell } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

  1. データの取得完了
  2. メンバのtodosにつっこむ
  3. tableViewを再描写する

だけでは?

あとはcellForRowAtがよしなにやってくれてると思いますが。

投稿2020/06/18 02:11

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sunglass

2020/06/18 05:45 編集

コメントありがとうございます。 (一応todos.countで最初書いています。。) 1. データの取得完了 →○(printで出力確認済み) 2. メンバのtodosにつっこむ →○(printで出力確認済み) 3. tableViewを再描写する = →△ override func viewWillAppear(_ animated: Bool) { self.tableView.reloadData() } という理解です。。 firestoreのデータ取得が出来てtableViewへの表示が出来ません。。 (コメントアウトしたTODOの方では表示できます。。)
退会済みユーザー

退会済みユーザー

2020/06/18 05:50 編集

[2. メンバのtodosにつっこむ]の直後にprint(todos)ってすると、何がコンソールに表示されますか? 確認済みとありますが、出力は確認されたのでしょうが、その中身は意図したものが入ってきているのでしょうか? tableViewのリロードのタイミングは確実に3番目に行われる確証はありますか?
sunglass

2020/06/18 05:56

エラー内容追記しました。 2. Optional(["title": よしだ, "content": なし])と出ます。 >その中身は意図したものが入ってきているのでしょうか? データは意図したものなのですが型が苦手でよくわかっていない状態です。現在は苦手な"Optional"の配列になっています。。 > tableViewのリロードのタイミングは確実に3番目に行われる確証はありますか? こちらは自信ないです。 順番変えてみますがFireStoreに入っているデータ自体が表示されていないので・・・
sunglass

2020/06/18 06:16

とりあえず追記したエラーは解決しました。 表示はまだ出来ていません。。
退会済みユーザー

退会済みユーザー

2020/06/18 06:18 編集

>2. メンバのtodosにつっこむ →○(printで出力確認済み)っ書いてあるので、print(self.todos)でStringの配列がコンソールに表示されると思います。 できてないと思いますけど…。 >> tableViewのリロードのタイミングは確実に3番目に行われる確証はありますか? >こちらは自信ないです。 >順番変えてみますがFireStoreに入っているデータ自体が表示されていないので・・・ コードを書く順番ではないので、非同期処理とかで調べてみてください ↓ https://qiita.com/fummicc1_dev/items/3fa0348fb9c94f14d279#非同期処理について
sunglass

2020/06/18 06:29

print(self.todos)だと[]になりました、、 let todos: [String] = []; ←がダメということでしょうか・・・?
退会済みユーザー

退会済みユーザー

2020/06/18 06:31

2番ができてないってこと。
sunglass

2020/06/18 06:50 編集

【訂正】 print(self.xxxx)でxxxにアクセスできるんですね、、(初め知りました。) (swiftの配列よく理解してないですが、、、) let todos = document.data().flatMap {$0} がよくないって事でしょうか・・・? このtodosをメンバにつっこむのでしょうか・・・? (雑な素人質問ですいません。。)
sunglass

2020/06/18 07:06

let todos = document...でデータを取得出来ているけど // メンバ var todos: [String] = []; にそのデータがつっこまれていないということでしょうか?? (だとするとどうやって・・・)
退会済みユーザー

退会済みユーザー

2020/06/18 07:10

とりあえず2番だけ考えればいいんだから楽じゃないですか? print(type(of: todos)) print(type(of: self.todos)) ってやってみて、自分の欲しいデータをどうやってself.todosに入れるか考えてみたら?
sunglass

2020/06/18 07:14

だいぶ楽になりました、、、(自己解決できるかわからないですが・・・)困ったらまたコメントします。。 とりあえず残りは自力で頑張ってみます。
sunglass

2020/06/21 07:19

(やっと)解決しました。。 的確な指示ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問