Передача данных в новый ViewController через Segue - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь передать строку данных через segue.Данные JSON были проанализированы с использованием JSONDecoder и правильно отображаются в консоли.Все работает нормально, за исключением случаев, когда я пытаюсь передать данные в детали ViewController, я либо не получаю данных, либо ошибка.Я использую prepareForSegue для передачи данных.

Вот код для ViewController:

var nowPlaying = [Results]()
var searchTitle = [Results]()

struct NowPlaying: Codable {
    let results: [Results]
}

struct Results: Codable {
    let title: String
    let poster_path: String?
    let id: Int
}

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

    var films: [Results]

    if searchBar.text == "" {
        films = [nowPlaying[indexPath.row]]
    }

    print("\(films)")

    performSegue(withIdentifier: "detailsSegue", sender: films)

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "detailsSegue" {
        if let detailView = segue.destination as? DetailsView {
                let filmCell = sender as? Results
                detailView.filmId = filmCell!.id
                print("\(filmCell!.id)")
        }
    }
}

Я получаю ошибку при detailView.filmId = filmCell.id

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

Это то, что выводится на консоль для print("\(films)"):

[Film_Bee.FilmsViewController.Results(title: "Venom", poster_path: 
Optional("/2uNW4WbgBXL25BAbXGLnLqX71Sw.jpg"), id: 335983)]

Ничего не печатается для print("\(filmCell!.id)")

Я не уверен, почему он не находит идентификатор в результатах, если он был найден при анализе и когда выбрана ячейка.

Вот мой код из DetailsView:

class DetailsView: UIViewController {

let homepage = FilmsViewController()

var filmId = 0

var filmDetails = [Details]()

struct Results: Codable {
    let title: String
    let poster_path: String?
    let id: Int
}

struct Details: Codable {
    let title: String
    let poster_path: String
}

override func viewDidLoad() {
    super.viewDidLoad()

    print(filmId)

}

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Пересмотрите свое имя в единственном / множественном числе.Вы хотите передать один фильм, а не массив

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

    let film : Results // singular form `Result` is less confusing

    if searchBar.text.isEmpty {
        film = nowPlaying[indexPath.row]
    } else {
        film = searchTitle[indexPath.row]
    }

    print("\(film)")

    performSegue(withIdentifier: "detailsSegue", sender: film)

}
0 голосов
/ 09 октября 2018

Вы определяете

var films: [Results]

, затем вызываете

performSegue(withIdentifier: "detailsSegue", sender: films)

, а затем разыгрываете

let filmCell = sender as? Results

, который не будет работать, поскольку Results не [Results] решить, хотите ли вы массив Result с или только один.

...