2016-09-12 10 views
0

このエラーは、私のtableViewを表示するときに間違ったときにどの部分の指示なしに見つかりました。ここで EXC_BREAKPOINT(コード= EXC_i386_BPT、サブコード= 0x0)(lldb)

Screenshot

は、問題の源であるかもしれないtableViewCellの一部です:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
// Dequeue cell 
let cell: UITableViewCell! = self.clientTable.dequeueReusableCellWithIdentifier("ClientCell", forIndexPath: indexPath) 
// Unpack message from Firebase DataSnapshot 
let messageSnapshot: FIRDataSnapshot! = self.messages[indexPath.row] 
let message = messageSnapshot.value as! Dictionary<String, String> 
let date = message[Constants.MessageFields.date] as String! 
if let imageUrl = message[Constants.MessageFields.imageUrl] { 
    if imageUrl.hasPrefix("gs://") { 
    FIRStorage.storage().referenceForURL(imageUrl).dataWithMaxSize(INT64_MAX){ (data, error) in 
     if let error = error { 
     print("Error downloading: \(error)") 
     return 
     } 
     cell.imageView?.image = UIImage.init(data: data!) 
    } 
    } else if let url = NSURL(string:imageUrl), data = NSData(contentsOfURL: url) { 
    cell.imageView?.image = UIImage.init(data: data) 
    } 
    cell!.textLabel?.text = "sent by: \(date)" 
} else { 
    let text = message[Constants.MessageFields.weight] as String! 
    cell!.textLabel?.text = date + ": " + text 
    cell!.imageView?.image = UIImage(named: "ic_account_circle") 
    if let photoUrl = message[Constants.MessageFields.photoUrl], url = NSURL(string:photoUrl), data = NSData(contentsOfURL: url) { 
    cell!.imageView?.image = UIImage(data: data) 
    } 
} 
return cell! 

}

プロジェクト全体をFirebaseチュートリアルに基づいており、私はちょうど作ってるんですテストのための変更はほとんどありません。事前に Github Link

ありがとう:ここ

はプロジェクトです。

答えて

1

私があなたのコードで行ったマイナーな変更により、それを動作させることができました。コンパイラを幸せに保つために、2つのimageUrlを(imageUrl as String)に変更しました。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    // Dequeue cell 
    let cell: UITableViewCell! = self.clientTable.dequeueReusableCellWithIdentifier("ClientCell", forIndexPath: indexPath) 
    // Unpack message from Firebase DataSnapshot 

    // changed vvv 
    //print statements are there just to check the data... 
    let messageSnapshot: FIRDataSnapshot! = self.messages[indexPath.row] 
    //print(messageSnapshot) 
    let message = messageSnapshot.value as! NSDictionary 
    //print(message) 
    let date = message.objectForKey("date") as! String 
    //print(date) 
    // changed ^^^ 

    //old code 
    //let message = messageSnapshot.value as! Dictionary<String, String> 
    //let date = message[Constants.MessageFields.date] as String! 
    // 

    if let imageUrl = message[Constants.MessageFields.imageUrl] { 
     if imageUrl.hasPrefix("gs://") { 
     FIRStorage.storage().referenceForURL(imageUrl as! String).dataWithMaxSize(INT64_MAX){ (data, error) in 
      if let error = error { 
      print("Error downloading: \(error)") 
      return 
      } 
      cell.imageView?.image = UIImage.init(data: data!) 
     } 
     } else if let url = NSURL(string:imageUrl as! String), data = NSData(contentsOfURL: url) { 
     cell.imageView?.image = UIImage.init(data: data) 
     } 
     cell!.textLabel?.text = "sent by: \(date)" 
    } else { 

     //let text = message[Constants.MessageFields.weight] as! String! <- doesn't work 

     // changed vvv 
     let aNum = message.objectForKey("weight") as! NSNumber 
     let text = aNum.stringValue 
     // changed ^^^ 

     cell!.textLabel?.text = date + ": " + text 
     cell!.imageView?.image = UIImage(named: "ic_account_circle") 
     if let photoUrl = message[Constants.MessageFields.photoUrl], url = NSURL(string:photoUrl as! String), data = NSData(contentsOfURL: url) { 
     cell!.imageView?.image = UIImage(data: data) 
     } 
    } 
    return cell! 
    } 
+0

ああ、それは働いた!ありがとうございました !!私はFirebase関連の新機能が新しくなっていますので、どう対処するか分かりませんでした。私は確かにあなたのコードの多くの基礎を勉強します。再度、感謝します! – Kei

1

ここでの問題は、messageSnapshot.valueをDictionaryにキャストしようとすることであり、失敗すると思います。

let message = messageSnapshot.value as! Dictionary<String, String> 

if let message = messageSnapshot.value as? NSDictionary{ 
} 

または

if let message = messageSnapshot.value as? [NSObject: AnyObject]{ 
} 

にして変化による警告をコンパイルし直す:

私はあなたが行を変更示唆しています。

そして、あなたはまだあなたのコード内の他のいくつかのバグがある...クラッシュを見つけるだろう...

多くはである何、あなたは「レット場合」を使用する必要があり、「ガードが聞かせて」、オプションのチェーンの代わりに使用したの」 as! "、" as String! "と表示されます。

これらのステートメントは、Appleが推奨しています。それはより安全です。あなたのバグをより迅速に見つけ出すのに役立ちます。そしてクラッシュを少なくします。

+0

あなたはそうです!私は以前のコードからのみ変更していたので、不注意な間違いがありました...アドバイスをいただきありがとうございます! – Kei

関連する問題