Невозможно передать значение типа UIViewController в PatternDetailViewController

Я пытаюсь свести контроллер представления к контроллеру подробного представления, но не могу. Я использую Core Data (впервые). Ошибка заключается в методе prepareForSegue и читает: "Не удалось передать значение типа" UIViewController "(0x1b81cdc) в" Patternz.PatternDetailViewController "(0x32488). (lldb) "

Порадовал бы объяснение, почему он не работает. Вот файлы.

ViewController.swift

import UIKit
import CoreData

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var tableView: UITableView!

    var patterns : [Pattern] = []

    var selectedPattern : Pattern? = nil


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.tableView.dataSource = self
        self.tableView.delegate = self

        createTestPatterns()

        var context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext!

        var request = NSFetchRequest(entityName: "Pattern")

        var results = context.executeFetchRequest(request, error: nil)

        if results != nil {
            self.patterns = results! as! [Pattern]
        }
    }

    func createTestPatterns() {
        var context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext!

        var pattern = NSEntityDescription.insertNewObjectForEntityForName("Pattern", inManagedObjectContext: context) as! Pattern
        pattern.name = "Dress Shirt"
        pattern.frontimage = UIImageJPEGRepresentation(UIImage(named: "examplePattern.jpg"), 1)
        context.save(nil)
    }


    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.patterns.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = UITableViewCell()
        var pattern = self.patterns[indexPath.row]
        cell.textLabel!.text = pattern.name
        cell.imageView!.image = UIImage(data: pattern.frontimage)
        return cell
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        self.selectedPattern = self.patterns[indexPath.row]
        self.performSegueWithIdentifier("patternDetailSegue", sender: self)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "patternDetailSegue" {
            var detailViewController = segue.destinationViewController as! PatternDetailViewController // Could not cast value of type 'UIViewController' to 'Patternz.PatternDetailViewController'
            detailViewController.pattern = self.selectedPattern
        }
    }



}

PatternDetailViewController.swift

import UIKit

class PatternDetailViewController: UIViewController {

    var pattern : Pattern? = nil

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        self.navigationItem.title = self.pattern!.name
    }



}

Ответы

Ответ 1

Проблема, как вы сказали, находится в следующих строках:

if segue.identifier == "patternDetailSegue" {
    var detailViewController = segue.destinationViewController as! PatternDetailViewController 
    // Could not cast value of type 'UIViewController' to 'Patternz.PatternDetailViewController'

Сообщение об ошибке сообщает вам, что destinationViewController этого сеанса не является, по сути, PatternDetailViewController. Вы можете подумать, что это так, но это не так. Вам нужно изучить этот segue в раскадровке и посмотреть, что на самом деле находится на конечной цели.

Тот факт, что сообщение об ошибке описывает его как UIViewController, заставляет меня подозревать, что вы забыли ввести какой-либо тип контроллера вида в этом контроллере представления. Инспектор удостоверений в раскадровке:

enter image description here

Ответ 2

Добавление к матовому ответу. Иногда вам также может потребоваться дважды проверить пользовательский класс Модуль в инспекторе идентификации.

введите описание изображения здесь

Контроллер вашего представления должен принадлежать определенному Module. Поэтому не забудьте выбрать Module из списка. В моем случае:

введите описание изображения здесь

Ответ 3

Похоже, вы используете навигационный контроллер, судя по вашему viewDidLoad() в PatternDetailViewController.

Если PatternDetailViewController встроен в UINavigatonController, тогда навигационный контроллер будет segue.destinationViewController.

Получить PatternDetailViewController следующим образом:

let vc: UINavigationController = segue.destinationViewController as! UINavigationController
let detailVC = vc.topViewController as! PatternDetailViewController
detailVC.pattern = self.selectedPattern

Ответ 4

Это случилось со мной, и я боролся в течение нескольких часов после всех остальных сообщений здесь. В итоге оказалось, что в моем контроллере диспетчера представлений отсутствует расширение .swift. Надеюсь, это поможет кому-то еще!

Ответ 5

Я решил проблему, выполнив следующие действия:

  1. Найдите исходную сцену в раскадровке. Перейти к Identity Inspector (третья вкладка на правой панели)
  2. Удалите (Cut/ctrl + x) "Класс" в разделе "Пользовательский класс" из инспектора идентификации.
  3. Переключиться на другую сцену.
  4. Вернитесь к исходной сцене.
  5. Вставьте модуль пользовательского класса, который вы только что удалили.
  6. Выход из XCode.
  7. Откройте Xcode.
  8. Clean.
  9. Построить.

Почему это работает? Я копирую чужую работу. Я, вероятно, написал имя класса в правой панели до того, как появился класс с таким именем. Я предполагаю, что Свифт не может найти такие вещи динамически. Вы должны вести себя так, как он хочет. Вы должны делать определенные вещи в определенном порядке.

Ответ 6

Моя проблема:

Не работа

let aBCViewController = UIViewController(nibName: "ABCViewController", bundle: nil) as! ABCViewController
present(aBCViewController, animated: true, completion: nil)

Работа

let aBCViewController = ABCViewController(nibName: "ABCViewController", bundle: nil)
present(aBCViewController, animated: true, completion: nil)

Ответ 7

Эта проблема может возникнуть, если вы скопировали файлы раскадровки из другого проекта и не изменили модуль. enter image description here

На изображении выше "EmployeeApp" - это имя старого проекта, а "clientTradingApp" - это имя нового проекта.

Удачного кодирования :)

Ответ 8

Попробуйте очистить продукт> Очистить

Изменение: я столкнулся с тем же сообщением об ошибке, и это было исправлено с помощью этого метода. Этот ответ не может конкретно ответить на вопрос