Массив объявлен для нулевого значения collectionview необязательным - PullRequest
0 голосов
/ 01 апреля 2019

Я создал массив, который является моими данными для моего представления коллекции.Я пытаюсь нажать на CollectionViewCell и воспроизвести звук, содержащийся в файловом компоненте моего массива.Я не знаю, как воспроизвести звук, и даже не могу начать, потому что я получаю нулевое значение для файлов, которые находятся в моем проекте xcode.

Ошибка: Поток 1: Неустранимая ошибка: Неожиданно найденноль при развертывании необязательного значения

Если я не распаковываю файл принудительно, это выдает ошибку ...

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 ]

1 голос
/ 01 апреля 2019

Похоже, ваши файлы не прикреплены к проекту.Проверьте ресурсы пакета и цели для прикрепленных файлов.И в этом случае лучше использовать 'lazy var' вместо 'let'

0 голосов
/ 01 апреля 2019

Не храните 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")
    }
}

Надеюсь, это поможет вам.

0 голосов
/ 01 апреля 2019

Прежде всего, вы не должны принудительно развертывать ! в вашем звуковом массиве, когда вы пытаетесь получить 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 или его ноль.

Во-вторых, убедитесь, что все ваши звуковые файлы добавлены в вашу цель. Проверьте инспектор свойств файла и убедитесь, что установлен флажок целевого приложения.

...