2016-09-12 76 views
0

我发现这个错误,没有任何指示,当显示我的tableView时出现错误。EXC_BREAKPOINT(code = EXC_i386_BPT,subcode = 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! 

}

整个项目是基于火力地堡的教程,我只是做一个测试的变化很少。

下面是该项目: Github Link

在此先感谢。

回答

1

我在代码中做的小修改允许它工作,并且我将几个(imageUrl)更改为(imageUrl as!字符串)以保持编译器的快乐。

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

相关问题