Как представить данные на контроллере представления, основываясь на ячейке, которая была подключена в предыдущем контроллере - PullRequest
1 голос
/ 12 июля 2019

У меня есть View Controller A, который имеет пять статических ячеек представления коллекции, с меткой заголовка и меткой описания.В зависимости от того, какая ячейка была нажата, мне нужно перейти к View Controller B, и View Controller B представит список продуктов, связанных с этими данными.

Я попытался сделать это методом didSelect, но я думаю, чтоЯ ошибаюсь ... Я понял, что после использования операторов печати я правильно получаю навигацию, и я также могу напечатать метку имени на View Controller A, но данные, передаваемые в View Controller B, равны нулю.

View Controller A

var параметры: [Параметр] = [Параметр (имя: «Щелочность», описание: «Здесь приведено описание того, насколько важно иметь стабильные измерения»), Параметр (имя: «Кальций ", описание:" Описание здесь о том, как важно иметь стабильные измерения "), // Сократить количество, чтобы я не занимал здесь слишком много места]

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
   let selectedCell = parameters[indexPath.row]
    // Create an instance of DeatailViewController and pass that variable
    let destinationVC = DetailViewController()
    destinationVC.dataReceived = selectedCell.name
    self.performSegue(withIdentifier: "segueID", sender: self)

}

View Controller B

только оператор печати. ​​

Ожидается: передать имя ячейки, которую я нажал, на второй виртуальный канал (пока), но я хочу показать список продуктов aсвязан с каждым элементом в имени метки.Например: Alkalinity покажет продукты Alkalinity (я должен определить это в той же самой другой модели)?

Ошибка: Отображение nil на VCB

Предложения:

Возможно, используя путь индексав didSelectRow?

Ответы [ 2 ]

1 голос
/ 12 июля 2019

При использовании segue для передачи данных вам нужно реализовать prepareForSegue

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    self.performSegue(withIdentifier: "segueID", sender:parameters[indexPath.row]) 
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "segueID" {
         let vc = segue.destination as! DetailViewController
         destinationVC.dataReceived = sender as! Model // Model is type of array parameters
    }
}

, но с использованием vc DetailViewController() вам нужно использовать present / push

let destinationVC = DetailViewController()
destinationVC.dataReceived = selectedCell.name
self.present(destinationVC,animated:true)

При втором способе представления DetailViewController() произойдет сбой приложения, так как вы не загружаете виртуальный канал из раскадровки, поэтому он должен выглядеть как

let vc = self.storyboard!.instantiateViewController(withIdentifier: "DetailID") as! DetailViewController
0 голосов
/ 12 июля 2019

Если вы используете segue, я бы достиг этого, сделав что-то вроде этого:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "segueID" {
            if let destinationVC = segue.destination as? DetailViewController {
            destinationVC.dataReceived = selectedCell.name
            }
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...