webentwicklung-frage-antwort-db.com.de

Der Wert des Typs UIViewController kann nicht in PatternDetailViewController umgewandelt werden

Ich versuche, einen View-Controller auf einen Detail-View-Controller herunterzuspielen, kann dies jedoch nicht. Ich verwende (zum ersten Mal) Core Data . Der Fehler befindet sich in der preparForSegue-Methode und lautet: "Konnte den Wert des Typs 'UIViewController' (0x1b81cdc) nicht in 'Patternz.PatternDetailViewController' (0x32488) ..__ konvertieren. (lldb) "

Ich würde mich über eine Erklärung freuen, warum es nicht funktioniert. Hier sind die Dateien.

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

Das Problem liegt, wie Sie gesagt haben, in folgenden Zeilen:

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

Die Fehlermeldung weist Sie darauf hin, dass destinationViewController dieses Segments nicht ein PatternDetailViewController ist. Sie denken vielleicht, aber das ist es nicht. Sie müssen diesen Abschnitt im Storyboard untersuchen und sehen, was wirklich am Zielende davon ist.

Die Tatsache, dass die Fehlermeldung es als UIViewController beschreibt, lässt vermuten, dass Sie vergessen haben, einen beliebigen View Controller-Typ im Identity-Inspector dieses View-Controllers im Storyboard einzugeben:

enter image description here

58
matt

Hinzufügen zu einer matten Antwort. In einigen Fällen müssen Sie möglicherweise auch die benutzerdefinierte Klasse Module im Identitätsinspektor überprüfen. 

 enter image description here

Ihr View-Controller muss zu einer bestimmten Module gehören. Stellen Sie also sicher, dass Sie eine Module aus der Liste auswählen. In meinem Fall:

 enter image description here

34
Malloc

Anscheinend verwenden Sie einen Navigationscontroller, der anhand Ihrer viewDidLoad() in PatternDetailViewController beurteilt wird.

Wenn PatternDetailViewController in eine UINavigatonController eingebettet ist, lautet der Navigationscontroller segue.destinationViewController.

Holen Sie sich den PatternDetailViewController folgendermaßen: 

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

Dieses Problem kann auftreten, wenn Sie Storyboard Dateien aus einem anderen Projekt kopieren und das Modul nicht geändert haben. enter image description here

In der obigen Abbildung ist "EmployeeApp" der alte Projektname und "clientTradingApp" der neue Projektname

Happy Coding :)

0
Ariven Nadar

Mein Problem ist:

funktioniert nicht

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

Arbeit

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

Das ist mir gerade passiert, und ich musste einige Stunden lang kämpfen, nachdem ich alle anderen Beiträge hier gelesen hatte. Am Ende stellte sich heraus, dass meiner Ziel-View-Controller-Datei die Erweiterung .Swift fehlte. Ich hoffe das hilft jemand anderem!

0
Alaa Awad

Ich habe das Problem mit den folgenden Schritten gelöst:

  1. Suchen Sie die Quellenszene im Storyboard. Gehe zum Identitätsinspektor (Dritte Registerkarte im rechten Bereich)
  2. Entfernen Sie (Ausschneiden/Strg + x) die "Klasse" unter "Benutzerdefinierte Klasse" aus dem Identitätsinspektor.
  3. Wechseln Sie zu einer anderen Szene.
  4. Wechseln Sie wieder zur Quellenszene.
  5. Fügen Sie das gerade entfernte benutzerdefinierte Klassenmodul ein.
  6. Beenden Sie XCode.
  7. Öffnen Sie Xcode.
  8. Sauber.
  9. Bauen.

Warum hat es funktioniert? Ich habe die Arbeit eines anderen kopiert. Ich habe wahrscheinlich den Klassennamen in das rechte Feld geschrieben, bevor es eine Klasse mit diesem Namen gab. Meine Vermutung ist, dass Swift solche Dinge nicht dynamisch finden kann. Sie müssen sich so verhalten, wie es wünscht. Sie müssen bestimmte Dinge in einer bestimmten Reihenfolge tun.

0
Onat Korucu