当我想在 m 单元格中设置图片时,我的 TableViewController
出现了一个奇怪的情况。我的细胞类别是:
class TableViewCell
class TableViewCell: UITableViewCell {
/* OUTLETS */
@IBOutlet weak var pictureInRowOutlet: UIImageView!
@IBOutlet weak var postDataOutlet: UILabel!
@IBOutlet weak var titleOutlet: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization cod
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}//end of class
class MyTableView
class MyTableView: UITableViewController{
var data:[[String:String]]? // data load from serwer
//code we don't need
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell
// now I want to set up picture in row
let urlAdressPhoto = (data?[indexPath.item]["picture"])!
// here, when I print urlAdressPhote I see correct value as String
cell.pictureInRowOutlet.image = UIImage(data: NSData(contentsOfURL: NSURL(string: urlAdressPhoto)!)!)
// in this moment I recive an information about "unexpectedly found nil while unwrapping an Optional value".
return cell
}
谁能告诉我为什么以及如何解决这个问题?
最佳答案
你强制打开至少 3 个不同的东西。在这一行中,
let urlAdressPhoto = (data?[indexPath.item]["picture"])!
你强制解包 (data?[indexPath.item]["picture"])
然后你就走运了。这不是 nil
。您赌博并赢了。
也许被你的成功 Revel 了,你决定加倍努力......在这里,你在一个语句中强制解包两次:
UIImage(data: NSData(contentsOfURL: NSURL(string: urlAdressPhoto)!)!)
哇!这意味着如果 NSURL(string: urlAdressPhoto)
为 nil
,您的程序将崩溃。或者,如果它不是 nil
,但对 NSData
的调用是 nil
,那么您的程序将崩溃。
教训是,我不能经常说:为了方便起见,不要使用 !
。它会破坏您的代码。虽然偶尔有充分的理由使用它,但大多数人使用它是因为他们懒得打开包装。然后他们得到 unexpectedly found nil while unwrapping an Optional value
。
我敢说这是 Stack Overflow 上最常见的 Swift 相关问题。每天肯定有大约 10 个问题与该错误消息相关,这都是因为人们出于完全超出我理解的原因坚持使用 !
。
试试这个:
guard let urlAdressPhoto = (data?[indexPath.item]["picture"])
, let url = NSURL(string: urlAdressPhoto)
, let data = NSData(contentsOfURL: url) else {
print("Something failed to unwrap..."); return cell
}
cell.pictureInRowOutlet.image = UImage(data: data)
关于ios - 展开可选值时为零,但在打印期间该值存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34728489/