Swift4:カスタムTable ViewでFatal error: Unexpectedly found nil while unwrapping an Optional value
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 552
現在カスタムTableViewを作成しケースごとに分けて表示しています。
各LabelにはAPIを叩いて取得したJsonデータが代入されています。
NavigationControllerを追加し他ところif let price:String = store![indexPath.row].price
と他のtime
,closedday
の部分で
Unexpectedly found nil while unwrapping an Optional value
とエラーが出ました。
NavigationControllerを追加する前は問題なく動いていました。
これはAPIを叩いて取得したJsonが読み込みが完了する前に強制アンラップしているのが原因でしょうか。
またその場合の対処はどうすればいいでしょうか。よろしくお願いします。
var store_id = ""
var store : [Store]?
var photoPath : [Store.photos]?
var tag : [Store.tags]?
override func viewDidLoad() {
super.viewDidLoad()
//Collectiopn DetaSources
imageCollectionView.dataSource = self
imageCollectionView.delegate = self
tagCollectionView.dataSource = self
tagCollectionView.delegate = self
//UIView Shadow
let shadowPath = UIBezierPath(rect: UIView.bounds)
UIView.layer.masksToBounds = false
UIView.layer.shadowColor = UIColor.black.cgColor
UIView.layer.shadowOffset = .zero
UIView.layer.shadowOpacity = 0.2
UIView.layer.shadowPath = shadowPath.cgPath
//Request API
let url = URL(string: "http://localhost:8000/store/api?store_id=" + store_id)
let request = URLRequest(url: url!)
let session = URLSession.shared
let encoder: JSONEncoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601
encoder.outputFormatting = .prettyPrinted
session.dataTask(with: request){(data, response, error)in if error == nil,
let data = data,
let response = response as? HTTPURLResponse{
let decoder: JSONDecoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
do {
let json = try decoder.decode(Store.self, from: data)
if json != nil {
print("JSON is Nil")
}else{
print(json)
}
self.store = [json]
self.photoPath = json.photos
self.tag = json.tags
if let imageURL = URL(string: "http://127.0.0.1:8000/photos/" + json.photos[0].path){
DispatchQueue.global().async {
let data = try? Data(contentsOf: imageURL)
if let data = data {
let image = UIImage(data: data)
DispatchQueue.main.async {
self.mainImage.image = image
}
}
}
}
DispatchQueue.main.async {
self.nameLabel.text = json.name
self.locationLabel.text = json.location
}
} catch {
print("error:", error.localizedDescription)
}
}
}.resume()
}
func numberOfSections(in tableView: UITableView) -> Int {
return 3
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch section {
case 0:
return 1
case 1 :
return 1
case 2 :
return 1
default:
return 0
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
switch indexPath.section {
case 0 :
//Price Cell
let priceCell = tableView.dequeueReusableCell(withIdentifier: "priceCell", for: indexPath) as? priceTableViewCell
if let price:String = store![indexPath.row].price{
priceCell?.priceLabel.text! = price
}else{
priceCell?.priceLabel.text! = "-"
}
return priceCell!
case 1 :
//timeCell
let timeCell = tableView.dequeueReusableCell(withIdentifier: "timeCell", for: indexPath) as? timeTableViewCell
if let time:String = store![indexPath.row].open_time{
timeCell?.timeLabel.text! = time
}else{
timeCell?.timeLabel.text! = "-"
}
return timeCell!
case 2 :
//closedayCell
let closedayCell = tableView.dequeueReusableCell(withIdentifier: "closedayCell", for: indexPath) as? closedayTableViewCell
if let closeday:String = store![indexPath.row].closed_day{
closedayCell?.closedayLabel.text! = closeday
}else{
closedayCell?.closedayLabel.text! = "-"
}
return closedayCell!
default :
print("Default Selected")
}
return cell
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
APIを叩いて取得したJsonが読み込みが完了する前に強制アンラップしているのが原因でしょうか
そうです。
読み込みが完了していないのにnumberOfRows(inSection:)
で1以上の値を返しているのが原因です。
読み込みが完了するまでは0を返すようにして下さい。
もしくは、読み込みが完了するまではセル生成時にstoreを参照しないことです。(セルに何も表示しない、「読み込み中」を表示させる、など)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/10/02 13:53
>セルに何も表示しない、「読み込み中」を表示させる、など
この部分についてどうコードに書けばいいのかわからないのでお手数ですが、参考になるようなサイトを教えて頂けると嬉しいです
2018/10/02 13:58 編集
「セルに何も表示しない」であれば、何もコードを書かなければいいです。
「読み込み中を表示させる」であれば、「読み込み中です」のラベルを置けばいいです。
2018/10/02 14:07
>「読み込み中」を表示させる
こちらについての参考など教えていただきたいです
2018/10/02 14:15
2018/10/02 14:20