Am trying to downcast a view controller to a detail view controller but can't. Am using Core Data (for the first time). The error is in the prepareForSegue method and reads: "Could not cast value of type 'UIViewController' (0x1b81cdc) to 'Patternz.PatternDetailViewController' (0x32488). (lldb) "
Would appreciate an explanation of why it doesn't work. Here are the files.
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
}
}
The problem, as you have said, is in these lines:
The error message tells you that the
destinationViewController
of this segue is not, in fact, a PatternDetailViewController. You may think it is, but it isn't. You need to examine this segue in the storyboard and see what's really at the destination end of it.The fact that the error message describes it as a UIViewController makes me suspect that you forgot to enter any view controller type in this view controller's Identity inspector in the storyboard:
It looks like you are using a navigation controller judging by your
viewDidLoad()
inPatternDetailViewController
.If
PatternDetailViewController
is embedded in aUINavigatonController
then the navigation controller will besegue.destinationViewController
.Get the PatternDetailViewController like this:
This just happened to me and I struggled for a couple hours following all the other posts here. In the end it turned out that my destination view controller file was missing the
.swift
extension. I hope this helps someone else!Adding to matt answer. Sometimes, you may also need to double check the custom class Module from the Identity inspector.
Your view controller need to belong to a specific
Module
. So make sure to select aModule
from the list. In my case:Try clean Product > Clean
Edit: I came across the same error message and it was fixed using this method. This answer may not specifically answer the question