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

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

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

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

Swift

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

Q&A

解決済

2回答

20307閲覧

Use of undeclared type エラーを解決したい

watasuke

総合スコア27

iOS

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

Swift

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

0グッド

0クリップ

投稿2017/03/15 06:39

###前提・実現したいこと
以下を参考にして、リアルタイムチャットを実現したいです。

【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

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

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

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

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

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

guest

回答2

0

質問に書かれたコードの中で、クラスを定義しているのはListViewControllerだけのように思われるのですが、ListTableViewCell は、どこかで定義されていますか? あるいは、importする中に含まれていますか?

class ListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

定義していないのであれば、Use of undeclared type エラーが出るのが正常です。

投稿2017/03/15 06:58

coco_bauer

総合スコア6915

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

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

0

ベストアンサー

参考サイトにListTableViewCellの定義が書いてないですね。
ソースから読み解くに、↓を足せばOKかなと。

ListTableViewCell.swift

swift

1import UIKit 2 3class ListTableViewCell: UITableViewCell { 4 5 @IBOutlet weak var contentLabel:UILabel! 6 @IBOutlet weak var postDateLabel:UILabel! 7 8 override func awakeFromNib() { 9 super.awakeFromNib() 10 // Initialization code 11 } 12 13 override func setSelected(_ selected: Bool, animated: Bool) { 14 super.setSelected(selected, animated: animated) 15 16 // Configure the view for the selected state 17 } 18 19} 20

投稿2017/03/15 06:52

fromageblanc

総合スコア2724

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

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

fromageblanc

2017/03/15 07:03

xibとともに、githubに置いてありましたね。。
watasuke

2017/03/16 07:31

ありがとうございます!初心者ゆえUITableViewCellを足すというのを知りませんでした・・・ おかげさまで動きました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問