CollectionView Segue найти ноль при получении ViewController - PullRequest
0 голосов
/ 18 мая 2018

У меня есть представление коллекции, которое выбирает элемент в своем индексе и выполняет переход к следующему ViewController.Когда представлен следующий ViewController, значение моего объекта равно nil.

Вот вызов в collectionView:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    guard let adViewVC = storyboard?.instantiateViewController(withIdentifier: adViewPageID) as? AdViewPageVC else {return}
    let adChoice = adArray[indexPath.row]
    adViewVC.advertisement = adChoice
    performSegue(withIdentifier: adViewPageSegue, sender: self)
}

Обратите внимание, что оператор guard проходит, и еслиЯ печатаю значение из adArray, оно имеет значение в этой функции.

После выполнения перехода, открывающего правый ViewController, рекламный объект всегда равен nil.

var advertisement : Advertisement!

override func viewDidLoad() {
    super.viewDidLoad()

    let title = advertisement.title
    print(title)

}

Это никогда не происходитполучение значения объекта, даже когда я вижу, что оно имеет значение во время присваивания в функции didSelectItem для представления коллекции.

Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Когда пользователь нажимает на collectionViewCell, приложение должно выполнить переход с indexPath в качестве отправителя:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    performSegue(withIdentifier: adViewPageSegue, sender: indexPath)
}

и подготовить все необходимые вещи в методе prepare(for:sender:).И вам не нужно запускать viewController из раскадровки.segue.destination достаточно.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let identifier = segue.identifier {
        if identifier == adViewPageSegue {
            guard let adViewVC = segue.destination as? AdViewPageVC else {return}
            let indexPath = sender as! IndexPath
            let adChoice = adArray[indexPath.row]
            adViewVC.advertisement = adChoice
        }
    }
}
0 голосов
/ 18 мая 2018

Вы должны установить переменную advertisement в функции prepare(for:sender:).Контроллер представления, который вы создаете в функции didSelect, не используется.

Добавьте что-то вроде этого:

func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let viewController = segue.destination as? PlayerViewController {
        let adChoice = adArray[sender]
        viewController.advertisement = sender as? STZMediaItem
    }
}

И обновите свою функцию didSelect так:

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