###前提・実現したいこと
以下を参考にして、リアルタイムチャットを実現したいです。
【Swift】リアルタイムチャットを実現するFirebaseでCRUD(データ作成、読み込み、更新、削除)をやってみる
###発生している問題・エラーメッセージ
swift3
1let cell = table.dequeueReusableCell(withIdentifier: "ListCell") as! ListTableViewCell
という箇所で
Use of undeclared type "ListTableViewCell"
というエラーが出ます。
宣言されていない型を使うな!!ということだと思うのですが、どこがまずっているのでしょうか?
###該当のソースコード
swift3
1import UIKit 2import Firebase //Firebaseをインポート 3 4class ListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 5 6 @IBOutlet weak var table: UITableView!//送信したデータを表示するTableView 7 8 var contentArray: [FIRDataSnapshot] = [] //Fetchしたデータを入れておく配列、この配列をTableViewで表示 9 10 var snap: FIRDataSnapshot! //FetchしたSnapshotsを格納する変数 11 12 let ref = FIRDatabase.database().reference() //Firebaseのルートを宣言しておく 13 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 //データを読み込むためのメソッド 17 self.read() 18 19 //TableViewCellをNib登録、カスタムクラスを作成 20 table.register(UINib(nibName: "ListTableViewCell", bundle: nil), forCellReuseIdentifier: "ListCell") 21 22 table.delegate = self //デリゲートをセット 23 table.dataSource = self //デリゲートをセット 24 25 // Do any additional setup after loading the view. 26 27 } 28 29 override func viewWillAppear(_ animated: Bool) { 30 super.viewWillAppear(animated) 31 32 //Cellの高さを調節 33 table.estimatedRowHeight = 56 34 table.rowHeight = UITableViewAutomaticDimension 35 } 36 37 override func viewDidDisappear(_ animated: Bool) { 38 super.viewDidDisappear(animated) 39 //画面が消えたときに、Firebaseのデータ読み取りのObserverを削除しておく 40 ref.removeAllObservers() 41 } 42 43 override func didReceiveMemoryWarning() { 44 super.didReceiveMemoryWarning() 45 // Dispose of any resources that can be recreated. 46 } 47 //ViewControllerへの遷移のボタン 48 @IBAction func didSelectAdd() { 49 self.transition() 50 } 51 52 //ViewControllerへの遷移 53 func transition() { 54 self.performSegue(withIdentifier: "toView", sender: self) 55 } 56 57 //セルの数 58 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 59 return contentArray.count 60 } 61 62 //返すセルを決める 63 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 64 //xibとカスタムクラスで作成したCellのインスタンスを作成 65 let cell = table.dequeueReusableCell(withIdentifier: "ListCell") as! ListTableViewCell 66 67 //配列の該当のデータをitemという定数に代入 68 let item = contentArray[indexPath.row] 69 //itemの中身を辞書型に変換 70 let content = item.value as! Dictionary<String, AnyObject> 71 //contentという添字で保存していた投稿内容を表示 72 cell.contentLabel.text = String(describing: content["content"]!) 73 //dateという添字で保存していた投稿時間をtimeという定数に代入 74 let time = content["date"] as! TimeInterval 75 //getDate関数を使って、時間をtimestampから年月日に変換して表示 76 cell.postDateLabel.text = self.getDate(number: time/1000) 77 78 return cell 79 } 80 81 82 func read() { 83 //FIRDataEventTypeを.Valueにすることにより、なにかしらの変化があった時に、実行 84 //今回は、childでユーザーIDを指定することで、ユーザーが投稿したデータの一つ上のchildまで指定することになる 85 ref.child((FIRAuth.auth()?.currentUser?.uid)!).observe(.value, with: {(snapShots) in 86 if snapShots.children.allObjects is [FIRDataSnapshot] { 87 print("snapShots.children...\(snapShots.childrenCount)") //いくつのデータがあるかプリント 88 89 print("snapShot...\(snapShots)") //読み込んだデータをプリント 90 91 self.snap = snapShots 92 93 } 94 self.reload(snap: self.snap) 95 }) 96 } 97 98 //読み込んだデータは最初すべてのデータが一つにまとまっているので、それらを分割して、配列に入れる 99 func reload(snap: FIRDataSnapshot) { 100 if snap.exists() { 101 print(snap) 102 //FIRDataSnapshotが存在するか確認 103 contentArray.removeAll() 104 //1つになっているFIRDataSnapshotを分割し、配列に入れる 105 for item in snap.children { 106 contentArray.append(item as! FIRDataSnapshot) 107 } 108 // ローカルのデータベースを更新 109 ref.child((FIRAuth.auth()?.currentUser?.uid)!).keepSynced(true) 110 //テーブルビューをリロード 111 table.reloadData() 112 } 113 } 114 115 //timestampで保存されている投稿時間を年月日に表示形式を変換する 116 func getDate(number: TimeInterval) -> String { 117 let date = Date(timeIntervalSince1970: number) 118 let formatter = DateFormatter() 119 formatter.dateFormat = "yyyy/MM/dd HH:mm" 120 return formatter.string(from: date) 121 } 122}
###試したこと
ProductのCleanは行いましたが変わりませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
iOS10
Swift3
Xcode8.2.1
回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。