无法将类型UIViewController的值转换为PatternDetailViewController

pde*_*ger 26 uiviewcontroller ios swift

我试图将视图控制器向下转换为详细视图控制器但不能.我正在使用核心数据(第一次).错误在prepareForSegue方法中,并显示:"无法将类型'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
        }
    }



}
Run Code Online (Sandbox Code Playgroud)

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
    }



}
Run Code Online (Sandbox Code Playgroud)

mat*_*att 67

正如你所说,问题在于以下几点:

if segue.identifier == "patternDetailSegue" {
    var detailViewController = segue.destinationViewController as! PatternDetailViewController 
    // Could not cast value of type 'UIViewController' to 'Patternz.PatternDetailViewController'
Run Code Online (Sandbox Code Playgroud)

错误消息告诉您,destinationViewController这个segue实际上不是 PatternDetailViewController.你可能认为它是,但事实并非如此.你需要检查这个赛格瑞的故事板,看看什么是真正的在它的目的端.

错误消息将其描述为UIViewController这一事实让我怀疑您忘记在故事板中此视图控制器的Identity检查器中输入任何视图控制器类型:

在此输入图像描述

  • 搜索了这个问题。找到了对我有用的答案。去投票并意识到我已经做了... (4认同)

Mal*_*loc 40

添加哑光答案.有时,您可能还需要从Identity检查器中仔细检查自定义类Module.

在此输入图像描述

您的视图控制器需要属于特定的Module.因此,请务必Module从列表中选择一个.就我而言:

在此输入图像描述

  • 是的,这正是我的问题的解决方案.+1 (5认同)

Max*_*Max 7

看起来你正在使用导航控制器判断你的viewDidLoad()in PatternDetailViewController.

如果PatternDetailViewController是嵌入在一个UINavigatonController然后导航控制器将segue.destinationViewController.

像这样获取PatternDetailViewController:

let vc: UINavigationController = segue.destinationViewController as! UINavigationController
let detailVC = vc.topViewController as! PatternDetailViewController
detailVC.pattern = self.selectedPattern
Run Code Online (Sandbox Code Playgroud)