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

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

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

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

Q&A

解決済

1回答

1570閲覧

Firebase RealtimeDatabaseによるテーブルビュー更新について

kkkkkkkt

総合スコア13

Swift

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

0グッド

0クリップ

投稿2018/09/12 03:02

編集2018/09/12 09:46

Firebaseから配列を取得して、その配列によってテーブルビューのセルの数や内容を更新したいと思っているのですが、どのタイミングで変数を更新したらいいのでしょうか。以下のプログラムでは配列がhogearrayに代入はされるのですが、テーブルビューの更新ができません。
よろしくお願いします。

<編集>
以下のようにコードを編集しました。

Swift4

1import Foundation 2 import UIKit 3 import Firebase 4 5 class OrderListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{ 6 // インスタンス変数 7 var DBRef:DatabaseReference! 8 var hogearray : [String] = [] 9 var array1 : [String] = [] 10 11 @IBOutlet weak var tableView: UITableView! 12 13 14 15 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 16 17 return self.hogearray.count 18 } 19 20 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 21 let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) 22 cell.textLabel!.text=self.hogearray[indexPath.row] 23 return cell 24 } 25 26 override func viewDidLoad() { 27 super.viewDidLoad() 28 //インスタンスを作成 29 DBRef = Database.database().reference() 30 31 //繰り返し 32 Timer.scheduledTimer( //TimerクラスのメソッドなのでTimerで宣言 33 timeInterval: 0.5, //処理を行う間隔の秒 34 target: self, //指定した処理を記述するクラスのインスタンス 35 selector: #selector(self.newArray(_:)), //実行されるメソッド名 36 userInfo: nil, //selectorで指定したメソッドに渡す情報 37 repeats: true //処理を繰り返すか否か 38 ) 39 } 40 41 @objc func newArray(_ sender: Timer) { //(_ sender: Timer) Timerクラスのインスタンスを受け取る 42 self.hogearray = [] 43 let defaultPlace = DBRef.child("table/orderorder") 44 defaultPlace.observe(.value, with: { snapshot in 45 for item in (snapshot.children) { 46 let snapshot = item as! DataSnapshot 47 let dict = snapshot.value as! String 48 self.hogearray.append(dict) 49 } 50 51 }) 52 } 53 54 override func didReceiveMemoryWarning() { 55 super.didReceiveMemoryWarning() 56 } 57} 58

しかしまだセルが更新できません。そこで変数を追って見たところ、newArrayメソッドの中で以下の位置でprintするとhogearrayが取得できている(例:[1,2,3])ようなのですが、

Swift4

1@objc func newArray(_ sender: Timer) { //(_ sender: Timer) Timerクラスのインスタンスを受け取る 2 self.hogearray = [] 3 let defaultPlace = DBRef.child("table/orderorder") 4 defaultPlace.observe(.value, with: { snapshot in 5 for item in (snapshot.children) { 6 let snapshot = item as! DataSnapshot 7 let dict = snapshot.value as! String 8 self.hogearray.append(dict) 9 } 10 print (self.hogearray) 11 }) 12 13 }

以下の位置では"[]"が出力されます。

Swift4

1@objc func newArray(_ sender: Timer) { //(_ sender: Timer) Timerクラスのインスタンスを受け取る 2 self.hogearray = [] 3 let defaultPlace = DBRef.child("table/orderorder") 4 defaultPlace.observe(.value, with: { snapshot in 5 for item in (snapshot.children) { 6 let snapshot = item as! DataSnapshot 7 let dict = snapshot.value as! String 8 self.hogearray.append(dict) 9 } 10 11 }) 12 print (self.hogearray) 13 }

メソッド外で変数が共有できていないということになると思うのですが、どこに原因があるのでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

hogearrayを更新した時点でテーブルをリロードして下さい。

reloadData()

投稿2018/09/12 03:48

fuzzball

総合スコア16731

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

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

kkkkkkkt

2018/09/12 05:24

すみません、tableviewの仕組みが深く理解出来ていないのですが、どこでreloadDataすればいいのでしょうか…?
fuzzball

2018/09/12 05:32

「hogearrayを更新した時点」と書きましたが。
kkkkkkkt

2018/09/12 06:28

すみません、見落としていました… self.tableView.reloadData()としてtableViewを参照したのですが、Ambiguous referenceのエラーが出ました。セル数のファンクションとセルの中身のファンクションに重複しているせいだと思うのですが、どうすればいいのでしょうか?
fuzzball

2018/09/12 06:48

重複というのはtableViewという名前のことでしょうか? そうであれば、重複しても問題ありません。(問題があるとしても名前を変えればいいだけです) 問題は他にあります。
kkkkkkkt

2018/09/12 07:19

そうなると、ビルドできないのはどこに原因があるのでしょうか…?
fuzzball

2018/09/12 07:29

なぜ情報を提示せずに答えだけを求めるのでしょうか?
kkkkkkkt

2018/09/12 07:44

それは大変失礼なことをしてしまいました。申し訳ありません。 当方初心者なもので、ソースコード全体とエラー以外にお伝えできる情報が思いつかないのですが、どのような情報が不足していたのでしょうか…?
fuzzball

2018/09/12 07:51

self.tableView.reloadData()をどこに追加したのか私には分かりません。 また、エラーメッセージは全文書いて下さい。
kkkkkkkt

2018/09/12 07:58

追記させていただきました。本文の通りです。 頂いた回答に即する改善になっているか自信がないですが、見ていただけると有難いです。よろしくお願いします。
fuzzball

2018/09/12 08:04

アウトレットを追加していないのでは? tableViewという名前でUITableViewのアウトレットを作って下さい。
kkkkkkkt

2018/09/12 09:47

当該のエラーについてはいただいた指摘の通りでした。ありがとうございます。 しかし、質問を編集させていただいた通り、まだセルが取得できていません。ご覧いただけると幸いです。
fuzzball

2018/09/12 10:41 編集

DispatchQueue.main.async { self.tableView.reloadData() } でどうでしょうか?
kkkkkkkt

2018/09/12 11:02 編集

調べて見たところ、初心者の自分には少し理解するのが難しかったのですが、どの辺りに挿入したらいいのでしょうか…?
kkkkkkkt

2018/09/12 11:25

すみません、今色々試して見たところ、hogearrayが更新された次に入れると動作しました! 同期非同期処理がわかったような気がします。非常に勉強になりました。 本当にありがとうございました!
fuzzball

2018/09/12 12:30 編集

解決したようですが一応書いておきます。 位置は修正コードの最初の方でいいです。(printで中身が出力される方) で、UIの更新はメインスレッドで行わないといけません。 その位置はメインスレッドではないようなので、 DispatchQueue.main.async { //この中はメインスレッドで実行される } ということになります。
kkkkkkkt

2018/09/12 16:34

なるほど、この関数の意味が良くわかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問