Передача данных из CollectionView в DetailVC в Swift 4 - PullRequest
0 голосов
/ 27 мая 2019

Мой CollectionView должен передать модель класса в DetailViewController, но когда я нажимаю на ячейку, я получаю нулевую ошибку.

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

CollectionViewController программно встроен в TabBarController.

Представление коллекции


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return soundArray.count
    }

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

    if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SoundCell", for: indexPath) as? SoundCell {
    let SoundClass = soundArray[indexPath.row]
    cell.updateUI(SoundClass: SoundClass)
    return cell

    } else {
    return UICollectionViewCell()
    }
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    self.performSegue(withIdentifier: "seguetosound", sender: self)

  }

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "seguetosound" {
    if let detailVC = segue.destination as? DetailSecondVC
    let sound = sender as? SoundClass { 
    detailVC.SoundClass = sound 

    }
 }

Контроллер подробного просмотра

class DetailSecondVC: UIViewController, UIWebViewDelegate {

private var _SoundClass: SoundClass!

var SoundClass: SoundClass {
        get {
            return _SoundClass
        } set {
            _SoundClass = newValue
        }
    }

Вы знаете, чего мне здесь не хватает?Я протестировал Segue с простым белым экраном, и он работает, но когда я пытаюсь передать данные, это не удается.

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Отредактировано: я думал, что решение было сделать переход от контроллера представления вместо из ячейки, но, как сказал Мэтт, переход был корректным из ячейки, но мне просто пришлось удалить реализацию didSelectItemAt

0 голосов
/ 27 мая 2019

Правильный подход таков.Сначала выясните, как вы хотите вызвать переход.Один из вариантов, в didSelect, вызывает переход в коде:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    self.performSegue(withIdentifier: "seguetosound", sender: self)
}

Но еще лучше, просто полностью удалите didSelectItemAt и получите переход в раскадровке из ячейки.Таким образом, переход запускается автоматически, когда пользователь касается ячейки.

Затем, в prepare, выясните, какой путь индекса был выбран, и извлеките данные из модели и передайте их в контроллер представления назначения (это может не скомпилироваться, потому что ваши имена переменных настолько ужаснычто я не могу прочитать ваш код, но в целом это правильный подход):

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "DetailSecondVC" {
        if let detailVC = segue.destination as? DetailSecondVC {
            if let paths = collectionView?.indexPathsForSelectedItems {
                let row = paths[0].row
                detailVC.SoundClass = SoundClasss[row]
            }
        }
    }
}
...