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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

解決済

1回答

1762閲覧

Firebaseからデータを読み込もうとすると、データは格納されているはずなのにnilが返ってきてしまう

watasuke

総合スコア27

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2017/03/17 02:34

###前提・実現したいこと
【Swift】リアルタイムチャットを実現するFirebaseでCRUD(データ作成、読み込み、更新、削除)をやってみる
を参考にして、Firebaseを使ってデータベースからデータを読み込みたいです。

###発生している問題・エラーメッセージ

swift3

1 //返すセルを決める 2 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 3 //xibとカスタムクラスで作成したCellのインスタンスを作成 4 let cell = table.dequeueReusableCell(withIdentifier: "ListCell") as! ListTableViewCell 5 6 //配列の該当のデータをitemという定数に代入 7 let item = contentArray[indexPath.row] 8 //itemの中身を辞書型に変換 9 let content = item.value as! Dictionary <String, Any> 10 11 print (content) 12 //contentという添字で保存していた投稿内容を表示 13 cell.contentLabel.text = String(describing: content["content"]!) 14 //dateという添字で保存していた投稿時間をtimeという定数に代入 15 let time = content["date"] as! TimeInterval 16 //getDate関数を使って、時間をtimestampから年月日に変換して表示 17 cell.postDateLabel.text = self.getDate(number: time/1000) 18 19 return cell 20 21 }

cell.contentLabel.text = String(describing: content["content"]!)

という箇所でbreakして

fatal error: unexpectedly found nil while unwrapping an Optional value

と出てしまいます。

###データのcreate
createはこのように行っています。

func create() { //textFieldになにも書かれてない場合は、その後の処理をしない guard let text = captionField.text else { return } //ロートからログインしているユーザーのIDをchildにしてデータを作成 //childByAutoId()でユーザーIDの下に、IDを自動生成してその中にデータを入れる //setValueでデータを送信する。第一引数に送信したいデータを辞書型で入れる //今回は記入内容と一緒にユーザーIDと時間を入れる //FIRServerValue.timestamp()で現在時間を取る self.ref.child((FIRAuth.auth()?.currentUser?.uid)!).childByAutoId().setValue(["user": (FIRAuth.auth()?.currentUser?.uid)!,"content": text, "date": FIRServerValue.timestamp()]) }

Firebaseのコンソール画面を見てもデータ自体は格納されています。

###試したこと
print (content)
したところ、
["content": 〇〇, "date": 1489649696108, "user": xxxxx]
のように、content自体も返ってきます。

###補足情報(言語/FW/ツール等のバージョンなど)
iOS10
Swift3
Xcode8.2.1

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

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

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

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

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

fuzzball

2017/03/17 03:04

print(type(of: content["content"]!)) の出力を教えて下さい。
watasuke

2017/03/17 05:14

__NSCFStringと出力されました。
guest

回答1

0

ベストアンサー

cellがnilになっていないでしょうか?

swift

1let cell = tableView.dequeue​ReusableCell(with​Identifier:"ListCell" for:​ indexPath) as! ListTableViewCell 2

としてみて下さい。

投稿2017/03/17 03:56

fuzzball

総合スコア16731

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

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

watasuke

2017/03/17 05:14

回答ありがとうございます、ただやはり fatal error: unexpectedly found nil while unwrapping an Optional value が出てしまいました・・・。
fuzzball

2017/03/17 05:39 編集

cellはnilではなかったのでしょうか? ListTableViewCellのReuse identifierに ListCell を設定しているでしょうか?
watasuke

2017/03/17 06:27

cellはnilではなく何かしら入っています。 >ListTableViewCellのReuse identifierに ListCell を設定 こちらは下記のように設定しているつもりですが、ここのことではないでしょうか? override func viewDidLoad() { super.viewDidLoad() //データを読み込むためのメソッド self.read() //TableViewCellをNib登録、カスタムクラスを作成 table.register(UINib(nibName: "ListTableViewCell", bundle: nil), forCellReuseIdentifier: "ListCell") table.delegate = self //デリゲートをセット table.dataSource = self //デリゲートをセット }
fuzzball

2017/03/17 06:46 編集

cellがnilでないならreuse idに関しては大丈夫です。 print(cell.contentLabel)の出力を教えて下さい。 .contentLabelは、xib上のUILabelとOutletで繋がっているでしょうか?
fuzzball

2017/03/17 07:37 編集

あれ、xib使ってないんですか。 それなら、table.register(...)は必要ありません。一旦、コメントアウトして下さい。 で、StoryboardのListCellのAttributes inspectorにあるIdentifierに ListCell を設定して下さい。 これでどうなるか教えて下さい。 >>なにも出力されないようです 何か出力されるはずですが。そのprint通ってますか?
watasuke

2017/03/17 08:15

>table.register(...)は必要ありません。一旦、コメントアウトして下さい。 こちらを行ったところ、Cellの中身が表示され、落ちることもなくなりました! ただ、一応xibはListTableViewCell.xibというファイルを置いています。 わたしはxib上のUILabelとOutletで繋げるという方法がわかっていないようです。 厚かましいですがこちらを教えていただけないでしょうか?
fuzzball

2017/03/17 08:32

1. xibのFile's OwnerにListTableViewCellを設定する。 2. Reuse idは、Storyboard上とは別のものにする。 3. table.register(...)で登録する。 4. 2で設定したReuse idでセルを生成する。 こんな感じ? Storyboard上のセルと併用する必要が無いのであれば、 2. Storyboard上のセル(もしくは、Reuse idだけ)削除して、xib上のReuse idを ListCell にする。 となります。
watasuke

2017/03/17 08:43

ありがとうございます!今回は大変助かりました! がんばってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問