Невозможно передать данные с одного контроллера на другой с помощью Segue Swift 5 - PullRequest
0 голосов
/ 11 октября 2019

У меня есть два views, которые я хотел бы передать данные из одного представления в другое. В первом представлении у меня есть данные, которые я хотел бы передать следующему представлению. Давайте назовем его FirstViewController. Однако FirstViewController встроен в NavigationViewController, и secondViewController позволяет назвать его DestinationViewController.

enter image description here

Я попробовал эту логику IN FirstViewController:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "DestinationViewController") {

        if let vc: DestinationViewController = segue.destination as? DestinationViewController {
            vc.id = id
        }

    }

}


override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if indexPath.section == 1
    {
         self.id = ((self.categorytArray.object(at: indexPath.row)as AnyObject).value(forKey: "id")as! NSNumber)
        print(self.id)
         self.performSegue(withIdentifier: "DestinationViewController", sender: self)

    }

}

on destinationController Я получаю пустое значение для идентификатора.

, если я изменяю в этой строке

if let vc: DestinationViewController = segue.destination as! DestinationViewController

Я получаю эту ошибку:

Не удалось привести значение типа «UINavigationController» (0x10f9b3760) к «Name.DestinationViewController» (0x1067f7c68). 2019-10-11 12: 52: 11.535900 + 0530 Имя [2412: 94748] Не удалось преобразовать значение типа «UINavigationController» (0x10f9b3760) в «Name.DestinationViewController» (0x1067f7c68).

Спасибозаранее.

1 Ответ

0 голосов
/ 11 октября 2019

Поскольку ваш View Controller встроен в Navigation Controller, вам также необходимо извлечь его из Navigation Controller.

Попробуйте:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let nvc = segue.destination as? UINavigationController, let vc = nvc.viewControllers.first as? DestinationViewController else {
        return
    }
    vc.id = id

}

Сначала вы получите навигационный контроллер (nvc), то вы получите целевой VC из списка дочерних контроллеров представления. Как правило, первый контроллер в контроллере навигации будет первым в массиве.

Также вам не нужно указывать отправителя в вызове executeSegue.

self.performSegue(withIdentifier: "DestinationViewController", sender: nil)

Вы заметите, что prepareForSegue имеет параметр sender, но, поскольку вы получаете доступ к информации, которую хотитепередавайте DetailViewController через переменную класса в вашем первом View Controller, вы все равно не используете этот параметр отправителя.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...