Arrays 致命错误:在展开可选值时发现意外的nil
我的数据数组有问题,在此数据数组中,我发送了6个图像的名称,以便稍后将它们加载到CollectionView中,这6个图像加载良好,没有任何问题,但当我添加字符串值以发送时,它会给我一个空错误: 这是我的类,其中是我的数据数组:Arrays 致命错误:在展开可选值时发现意外的nil,arrays,model-view-controller,swift3,Arrays,Model View Controller,Swift3,我的数据数组有问题,在此数据数组中,我发送了6个图像的名称,以便稍后将它们加载到CollectionView中,这6个图像加载良好,没有任何问题,但当我添加字符串值以发送时,它会给我一个空错误: 这是我的类,其中是我的数据数组: import UIKit class HBook{ var imagenB: UIImage! var estatus: String! init(estatus: String, imagenB: UIImage) {
import UIKit
class HBook{
var imagenB: UIImage!
var estatus: String!
init(estatus: String, imagenB: UIImage) {
self.estatus = estatus
self.imagenB = imagenB
}
class func getData() -> [HBook]{
let rawData = [
["imagenB":"book1"],
["imagenB":"book2"],
["imagenB":"book3"],
["imagenB":"book4"],
["imagenB":"book5"],
["imagenB":"book6"],
["estatus":"No reservado"]
]
var hbook:[HBook] = []
for item in rawData{
hbook.append(HBook(estatus: item["estatus"]!, imagenB: UIImage(named: item["imagenB"]!)!))
}
return hbook
}
}
我打印数据数组以查看哪个变量为空,但显然所有变量都有一个赋值:
我不知道为什么要发送空值
此信息是在另一个具有CollectionView和标签的类中检索的,我传递信息的方法位于cellForItemAt方法中:
class DetailViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
@IBOutlet weak var contenedorCollection: UIView!
@IBOutlet weak var myCollection: UICollectionView!
@IBOutlet weak var pages: UIPageControl!
@IBOutlet weak var estatus: UILabel!
var hbook = HBook.getData()
var nombreH = ""
override func viewDidLoad() {
super.viewDidLoad()
pages.numberOfPages = hbook.count
self.title = nombreH
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return hbook.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CellCollectionViewCell
cell.imageview.image = hbook[indexPath.row].imagenB
estatus.text = hbook[indexPath.row].estatus
return cell
}
我认为问题在于数据类。请用以下代码替换您的HBook类,它将正常工作,无需进一步更改:
class HBook{
var imagenB: UIImage?
var estatus: String?
init(estatus: String? = nil, imagenB: UIImage? = nil) {
self.estatus = estatus
self.imagenB = imagenB
}
class func getData() -> [HBook]{
let rawData = [
["imagenB":"book1","estatus":"No reservado"],
["imagenB":"book2","estatus":"No reservado"],
["imagenB":"book3","estatus":"No reservado"],
["imagenB":"book4","estatus":"No reservado"],
["imagenB":"book5","estatus":"No reservado"],
["imagenB":"book6","estatus":"No reservado"]
]
var hbook:[HBook] = []
for item in rawData{
if let image = item["itemnB"]{
hbook.append(HBook(estatus: item["estatus"], imagenB:UIImage(named:image)))
}else{
hbook.append(HBook(estatus: item["estatus"]))
}
}
return hbook
}
}为什么要将estatus.text=hbook[indexPath.row].cellForItem方法中的estatus设置为estatus标签不属于集合的一部分view@Enrique为什么要把它完全拆开??我会永远给你崩溃。尝试使用“if let”或guard语句来展开是的,你是对的,你的解决方案帮助我解决了问题,但我有一个问题,有没有办法避免在每个值中添加状态修复方案是什么?我的意思是:[“imagenb”:[“book1”、“book2”、“book3”、“book4”、“book5”],[“estatus”:“No reservado”]@Enrique:为了做到这一点,你需要用一个字典来代替数组,其中数组代表键“imagenb”,字符串代表键“estatus”。