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

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

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

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

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Swift

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

Q&A

解決済

1回答

1274閲覧

FirestoreのデータをTableviewに表示させたいが何も表示されない

massanmesu

総合スコア36

Firebase

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

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Swift

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

0グッド

0クリップ

投稿2021/05/08 04:37

編集2021/05/08 04:39

以下の記事をもとにFirestoreのデータをTableviewに表示させようとしています。
https://note.com/shion_consul/n/n6a194378c0e3

以下の流れでコードを書いたのですが、TableViewに何も表示されません。

  1. TableViewControllerのviewDidLoad()でコンソールからデータを取得する関数getData()を実行
  2. データモデルを定義したカスタムクラスItemがインスタンス化され、データを格納するための変数itemsに代入
  3. 検索した場合の検索後に表示されるデータcurrentItemsにitemsのデータを代入

セルにcurrentItemsのデータをセット

カスタムデータモデルクラスItems

import UIKit import FirebaseFirestore class Item: NSObject { var registrationTime: String var name: String var price: String var impression: String var rating: Int init(document: QueryDocumentSnapshot) { let Dic = document.data() self.registrationTime = Dic["registrationTime"] as! String self.name = Dic["name"] as! String self.price = Dic["price"] as! String self.impression = Dic["impression"] as! String self.rating = Dic["rating"] as! Int } }

TableViewController

import UIKit import FirebaseFirestore class ItemTableViewController: UITableViewController, UISearchBarDelegate{ @IBOutlet weak var search: UISearchBar! var items = [Item]() var currentItems = [Item]() override func viewDidLoad() { super.viewDidLoad() search.delegate = self search.enablesReturnKeyAutomatically = false // Firestoreからデータ取得 getData() // 検索後のデータに当てはめる currentItems = items } override func numberOfSections(in tableView: UITableView) -> Int { return 1 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return currentItems.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? ItemTableViewCell else { fatalError("セルのダウンキャストに失敗しました") } let item = currentItems[indexPath.row] cell.registrationTimeText.text = item.registrationTime cell.itemNameText.text = item.name return cell } // データ取得 func getData() { let Ref = Firestore.firestore().collection("users") // コレクション指定 Ref.getDocuments() { (querySnapshot, error) in if let error = error { print(error) return } self.items = querySnapshot!.documents.map { document in let item = Item(document: document) return item } } } // 検索処理 func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { guard !searchText.isEmpty else { currentItems = items tableView.reloadData() return } currentItems = items.filter({ item -> Bool in item.name.lowercased().contains(searchText.lowercased()) }) tableView.reloadData() } // 検索ボタンをタップしたらキーボードが下がる func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { searchBar.resignFirstResponder() } }

他に確認する事項があればご教授ください。
宜しくお願いします。

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

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

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

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

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

tomato879241

2021/05/08 05:17

1. viewDidLoadに書いてあるcurrentItems = itemsは何のためでしょうか? 2. getData()の中でitemを取り出したのはいいものの、それをどのようにcurrentItemsに足しているのでしょうか? 3. Firestoreはデータをasynchronouslyで返すのでは? 4. データをFirestoreから返した後、tableViewをreloadDataしていないのでは?
guest

回答1

0

ベストアンサー

ItemTableViewController に items と currentItems というプロパティがありますが、items は読み込み中の一時的な変数で、読込が終わったら currentItems にコピーしたいってことですよね。

で、viewDidLoad の中では、

Kotlin

1 override func viewDidLoad() { 2 // 略 3 4 // Firestoreからデータ取得 5 getData() 6 7 // 検索後のデータに当てはめる 8 currentItems = items 9 }

getData() を呼んだ直後に currentItems = items してますが、getData() そのものはデータの取得を開始した直後に (実際にデータを取得する前に) return しますので、その時点で currentItems = items してもまだデータはありません。

getData() の中で

Kotlin

1 // データ取得 2 func getData() { 3 let Ref = Firestore.firestore().collection("users") // コレクション指定 4 Ref.getDocuments() { (querySnapshot, error) in 5 if let error = error { 6 print(error) 7 return 8 } 9 10 self.items = querySnapshot!.documents.map { document in 11 let item = Item(document: document) 12 return item 13 } 14 } 15 }

Ref.getDocuments() の後ろに { (querySnapshot, error) in 〜 } というクロージャがありますが、この部分は getData() が return してしばらく経って、実際にデータを取得できたタイミングで呼ばれますので、たぶんこの最後で currentItems = items して self.tableView.reloadData() で表示を更新する必要があると思います。

投稿2021/05/08 12:41

hoshi-takanori

総合スコア7901

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

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

massanmesu

2021/05/13 04:49

わかりやすいご説明ありがとうございます。 正常に動作しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問