无法将typesUIViewController的值转换为PatternDetailViewController

我试图将视图控制器向下转换为详细视图控制器,但不能。 我正在使用核心数据(第一次)。 该错误是在prepareForSegue方法和读取:“无法将types'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 } } 

正如你所说的那样,问题在于这些方面:

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

错误消息告诉你,这个segue的destinationViewController实际上不是一个PatternDetailViewController。 你可能会认为这是事实,但事实并非如此。 你需要在storyboard中检查这个segue,看看它的目的地究竟是什么。

错误消息将其描述为UIViewController的事实使我怀疑您忘记在故事板中此视图控制器的“标识”检查器中input任何视图控制器types:

在这里输入图像说明

添加到无光泽的答案。 有时,您可能还需要从“身份检查器”中仔细检查自定义类Module

在这里输入图像说明

你的视图控制器需要属于一个特定的Module 。 所以请确保从列表中select一个Module 。 在我的情况下:

在这里输入图像说明

看起来你正在用PatternDetailViewController viewDidLoad()来判断导航控制器。

如果PatternDetailViewControllerembedded在UINavigatonController那么导航控制器将是segue.destinationViewController

获取PatternDetailViewController像这样:

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