J'essaie d'abaisser un contrôleur de vue en contrôleur de vue de détail, mais je ne peux pas. Utilisation des données de base (pour la première fois) . L’erreur est dans la méthode prepareForSegue et lit: "Impossible de convertir la valeur du type" UIViewController "(0x1b81cdc) en" Patternz.PatternDetailViewController "(0x32488) . (lldb) "
J'apprécierais une explication de la raison pour laquelle cela ne fonctionne pas ... Voici les fichiers.
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
}
}
Comme vous l'avez dit, le problème est le suivant:
if segue.identifier == "patternDetailSegue" {
var detailViewController = segue.destinationViewController as! PatternDetailViewController
// Could not cast value of type 'UIViewController' to 'Patternz.PatternDetailViewController'
Le message d'erreur vous indique que la destinationViewController
de cette division est not, en fait un PatternDetailViewController. Vous pensez peut-être que c'est le cas, mais ce n'est pas le cas. Vous devez examiner cette séquence dans le story-board et voir ce qui se passe vraiment à la destination.
Le fait que le message d'erreur le décrit comme un UIViewController me fait penser que vous avez oublié d'entrer un type de contrôleur de vue dans l'inspecteur d'Identity de ce contrôleur de vue dans le story-board:
Il semble que vous utilisiez un contrôleur de navigation à en juger par votre viewDidLoad()
dans PatternDetailViewController
.
Si PatternDetailViewController
est incorporé dans une UINavigatonController
, le contrôleur de navigation sera alors segue.destinationViewController
.
Obtenez le PatternDetailViewController comme ceci:
let vc: UINavigationController = segue.destinationViewController as! UINavigationController
let detailVC = vc.topViewController as! PatternDetailViewController
detailVC.pattern = self.selectedPattern
Cela m'est juste arrivé et j'ai lutté pendant quelques heures après tous les autres postes ici. Finalement, il s'est avéré que l'extension .Swift
était manquante dans le fichier du contrôleur de vue de destination. J'espère que ça aidera quelqu'un d'autre!
J'ai résolu le problème en suivant ces étapes:
Pourquoi cela a-t-il fonctionné? Je copiais le travail de quelqu'un d'autre. J'ai probablement écrit le nom de la classe dans le panneau de droite avant qu'il y ait une classe portant ce nom. Je suppose que Swift ne peut pas trouver ce genre de choses de manière dynamique. Vous devez vous comporter comme il le souhaite. Vous devez faire certaines choses dans un certain ordre.