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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

1回答

2138閲覧

配列をTableViewに反映させる

tonosam

総合スコア14

Firebase

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/08/19 04:00

Firebase Cloudstoreから取得したcollection("users")のデータをtableviewに一覧で表示する為に以下の様なコードを作成致しました。
しかしながら、func takename内では想定通りに配列が取得できているのですが(print(self.tn)では)、実際にTableViewに反映させると配列の中身が["取得したデータ"]の一つしか取得できておりません。
非同期処理などについて一通り、リサーチしたのですが一向に解決できません。
どこを訂正すれば想定通りTableViewに反映されるのでしょうか?

解答よろしくお願い致します。

Swift

1import UIKit 2import Firebase 3import FirebaseAuth 4 5class CellsViewController: UIViewController , UITableViewDelegate, UITableViewDataSource { 6 7 var tn:[String] = ["取得したデータ"] 8 var tableView: UITableView! 9 10 func takename(){ 11 // Mainスレッド 12 Firestore.firestore().collection("users").getDocuments() { (querySnapshot, err) in 13 // Backgroundスレッド 14 if let err = err { 15 print("(err)") 16 } else { 17 for document in querySnapshot!.documents { 18 let sam:String = (document.documentID) 19 let numnum:[String] = sam.components(separatedBy: " ") 20 21 self.tn += numnum 22 } 23 print(self.tn) 24// →想定通りの配列がprintされる 25 26 // TableViewやその他UIの更新を行う場合はMainスレッドで行う必要がある為、以下でMainスレッドに戻す 27 DispatchQueue.main.async { 28// 実行時、下記に対してエラーが出ます。Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value 29 self.tableView.reloadData() 30 } 31 } 32 } 33 } 34 35 override func viewDidLoad() { 36 super.viewDidLoad() 37 38 takename() 39 } 40 41 override func didReceiveMemoryWarning() { 42 super.didReceiveMemoryWarning() 43 } 44 45 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 46// print(tn.count) →1 47 return tn.count 48 } 49 50 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 51 let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 52 53 cell.textLabel!.text = tn[indexPath.row] 54 55 return cell 56 } 57} 58

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

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

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

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

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

guest

回答1

0

ベストアンサー

tableViewのインスタンスがどこにも追加されていません。
nilのものにreloadDataしている状態になっています。

viewDidLoad()を下記のように変更し,

Swift

1override func viewDidLoad() { 2 super.viewDidLoad() 3 4 setTableView() 5 takename() 6 }

下記のようなtableViewのインスタンス生成のメソッドを用意してください。

Swift

1func setTableView(){ 2 tableView = UITableView(frame: self.view.frame) 3 tableView.delegate = self 4 tableView.dataSource = self 5 tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") 6 self.view.addSubview(tableView) 7}

投稿2019/08/19 04:24

fathy

総合スコア254

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

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

tonosam

2019/08/19 04:37

解決いたしました!! 本当に助かりました。ありがとうございます!!!!!
fathy

2019/08/19 04:38

????‍♀️
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問