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

Ios 无法将UIViewController类型的值强制转换为PatternDetailViewController,ios,swift,uiviewcontroller,Ios,Swift,Uiviewcontroller,我试图将视图控制器向下转换为详细视图控制器,但无法。我第一次使用核心数据。 错误在prepareForSegue方法中,读取:无法将类型为“UIViewController”0x1b81cdc的值强制转换为“Patternz.PatternDetailViewController”0x32488。 lldb 如果您能解释一下为什么它不起作用,我将不胜感激。 这是文件 ViewController.swift import UIKit import CoreData class ViewCont

我试图将视图控制器向下转换为详细视图控制器,但无法。我第一次使用核心数据。 错误在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
        }
    }



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



}
PatternDetailViewController.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
        }
    }



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



}

正如你所说,问题在于:

如果segue.identifier==patternDetailSegue{ var detailViewController=segue.destinationViewController as!PatternDetailViewController //无法将“UIViewController”类型的值强制转换为“Patternz.PatternDetailViewController” 错误消息告诉您,此序列的destinationViewController实际上不是PatternDetailViewController。您可能认为它是,但它不是。您需要在情节提要中检查此序列,看看它的目标端到底是什么

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


从PatternDetailViewController中的viewDidLoad判断,您似乎正在使用导航控制器

如果PatternDetailViewController嵌入到UINavigatonController中,则导航控制器将是segue.destinationViewController

按如下方式获取PatternDetailViewController:

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

添加到matt answer。有时,您可能还需要从Identity inspector重新检查自定义类模块

您的视图控制器需要属于特定的模块。因此,请确保从列表中选择一个模块。在我的情况下:


这件事刚刚发生在我身上,我花了几个小时来关注这里的所有其他帖子。最后,我发现我的目标视图控制器文件缺少.swift扩展名。我希望这对其他人有帮助!

请尝试清理 产品>清洁


编辑:我遇到了相同的错误消息,并使用此方法修复了该错误消息。此答案可能无法具体回答问题

我通过以下步骤解决了问题:

在情节提要中找到源场景。转到右侧面板中的“身份检查器”第三个选项卡 从标识检查器中删除“自定义类”下的类的剪切/ctrl+x。 切换到另一个场景。 切换回源场景。 粘贴刚删除的自定义类模块。 退出XCode。 打开Xcode。 清洁的 建筑 为什么它能工作?我在复制粘贴别人的作品。在有一个同名的类之前,我可能在右侧面板中写下了类名。我猜斯威夫特无法动态地找到这类东西。你必须按照它的意愿行事。你必须按特定的顺序做某些事情。

我的问题是:

不行

工作


如果您从其他项目复制情节提要文件,但未更改模块,则可能会发生此问题

在上图中,EmployeeApp是旧项目名称,clientTradingApp是新项目名称


快乐编码:

是的,我忘了在情节提要中输入视图控制器类型。一旦我解决了这个问题,它就起作用了。谢谢。谷歌搜索了这个问题。找到了这个对我有效的答案。转到upvote,意识到我已经做了……一些很容易忽略的事情:为segue做准备:UIStoryboardSegue,发件人:有吗?当任何时候都有一个segue。不管你是在情节提要中创建它,还是在代码中调用performSegue,只要你覆盖prepare,它就会被调用。最后,即使在情节提要中所有的设置都正确,你也可能会得到这个错误,因为你没有检查该特定序列的所有可能标识符UIViewController。这在传递数据时对我很有效!谢谢!是的,这正是我问题的解决方案。+1这是我的问题,进行了重构,但忘了检查它!谢谢!在我的情况下,原因是:在序列图像板中,在创建此类PatternDetailViewContror之前,我为视图控制器设置了类PatternDetailViewControllerller.swift感谢评论:您好,这篇文章似乎没有为这个问题提供答案。请编辑您的答案并加以改进,或者将其作为评论发布。请解释为什么您认为清理构建文件夹可以解决此铸造问题。