web-dev-qa-db-fra.com

Impossible de transtyper la valeur de type UIViewController en PatternDetailViewController

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
    }



}
23
pdenlinger

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:

enter image description here

58
matt

Ajoutant à mat répondre. Parfois, vous devrez peut-être également revérifier la classe personnalisée Module dans l'inspecteur d'identité. 

 enter image description here

Votre contrôleur de vue doit appartenir à un Module spécifique. Veillez donc à sélectionner un Module dans la liste. Dans mon cas:

 enter image description here

34
Malloc

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
7
Max

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!

0
Alaa Awad

J'ai résolu le problème en suivant ces étapes:

  1. Trouvez la scène source dans le storyboard. Accédez à l'inspecteur d'identité (troisième onglet du panneau de droite).
  2. Supprimez (Coupez/ctrl + x) la "Classe" sous "Classe personnalisée" de l'inspecteur d'identité.
  3. Basculer vers une autre scène.
  4. Revenez à la scène source.
  5. Collez le module de classe personnalisé que vous venez de supprimer.
  6. Quittez XCode.
  7. Ouvrez Xcode.
  8. Nettoyer.
  9. Construire.

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.

0
Onat Korucu