为collectionview声明的数组null值可选

时间:2019-04-01 10:14:26

标签: ios swift xcode optional-values

我创建了一个数组,该数组是我的集合视图的数据。 我试图点击CollectionViewCell并播放数组文件组件中包含的声音。我不知道如何播放声音,甚至无法入门,因为我得到的xcode项目中的文件为空值。

错误:线程1:致命错误:展开一个可选值时意外发现nil

如果我不强制打开文件,则会给我一个错误...

class ViewController: UIViewController {

let sounds : [Sounds] = [Sounds(statement: "A", file: Bundle.main.url(forResource: "A", withExtension: "aifc")!),
                            Sounds(statement: "B", file: Bundle.main.url(forResource: "B", withExtension: "aifc")!),
                            Sounds(statement: "C", file: Bundle.main.url(forResource: "C", withExtension: "aifc")!),
                            Sounds(statement: "D", file: Bundle.main.url(forResource: "D", withExtension: "aifc")!)]

}

extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return sounds.count
    }

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "soundCell", for: indexPath) as! CollectionViewCell
        let Soundz = sounds[indexPath.item]
        cell.cellLabel.text = Soundz.statement

        return cell
    }

}

struct Sounds{
    var statement : String
    var file : URL 
}

3 个答案:

答案 0 :(得分:1)

看起来文件没有附加到项目中。检查捆绑包资源和附加文件的目标。而且在这种情况下,最好使用'lazy var'而不是'let'

答案 1 :(得分:0)

首先,当您尝试获取文件的URL时,请勿在声音阵列中强行拆开!。这导致崩溃。您应该选择一个可选的URL。

struct Sounds{
    var statement : String
    var file : URL?
}


let sounds : [Sounds] = [Sounds(statement: "A", file: Bundle.main.url(forResource: "A", withExtension: "aifc")),
                            Sounds(statement: "B", file: Bundle.main.url(forResource: "B", withExtension: "aifc")),
                            Sounds(statement: "C", file: Bundle.main.url(forResource: "C", withExtension: "aifc")),
                            Sounds(statement: "D", file: Bundle.main.url(forResource: "D", withExtension: "aifc"))]

}

这将首先解决崩溃问题。当您访问文件以进行播放时,只需先检查URL是否存在或没有URL。

第二,确保所有声音文件都已添加到目标。检查文件的属性检查器,并确保选中了您的应用目标复选框。

答案 2 :(得分:0)

  

不要在数组中保留Bundle.main.url(forResource:“”,withExtension:“”),就好像数组大小会增加一样,此语句将占用大量内存。

     

fileName 保留在对象中以及何时保留而不是您的方法   您需要该文件的路径,只需调用对象的filePath实例变量即可。

 let sounds = [Sounds(statement: "A", fileName: "A")]

您的结构将如下所示

struct Sounds {
    var statement : String
    var fileName: String
    var filePath : URL? {
        return Bundle.main.url(forResource: fileName, withExtension: "html")
    }
}

希望这会对您有所帮助。