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

Posted

技术标签:

【中文标题】无法将 UIViewController 类型的值转换为 PatternDetailViewController【英文标题】:Can't cast value of type UIViewController to PatternDetailViewController 【发布时间】:2015-07-15 20:59:02 【问题描述】:

我试图将视图控制器向下转换为详细视图控制器,但不能。我正在使用 Core Data(第一次)。 错误出现在 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
        
    




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
    




【问题讨论】:

【参考方案1】:

正如您所说,问题在于以下几行:

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

错误信息告诉你这个segue的destinationViewController不是,其实是一个PatternDetailViewController。你可能认为它是,但它不是。您需要检查情节提要中的这个转场,看看它的目标端是什么真正

错误消息将其描述为 UIViewController 的事实使我怀疑您忘记在情节提要的此视图控制器的身份检查器中输入任何视图控制器类型:

【讨论】:

是的,我忘了在 Storyboard 中输入视图控制器类型。一旦我解决了这个问题,它就起作用了。谢谢。 谷歌搜索了这个问题。找到这个对我有用的答案。去投票并意识到我已经这样做了...... 很容易被忽略的东西:prepare(for segue: UIStoryboardSegue, sender: Any?)(Swift 5 版本)只要有转场就会被调用。无论您是在情节提要中创建它还是在代码中调用performSegue,只要覆盖prepare,它就会始终被调用。最后,您可能会收到此错误(即使故事板中的所有内容都已正确设置),因为您没有检查特定UIViewController 的转场的所有可能标识符。【参考方案2】:

添加到亚光答案。有时,您可能还需要从身份检查器中仔细检查自定义类 Module

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

【讨论】:

是的,这正是我的问题的解决方案。 +1 这是我的问题,做了重构,忘记检查了!谢谢! 就我而言,原因是:在故事板中,我在创建此类 PatternDetailViewController.swift 之前为视图控制器设置了一个“PatternDetailViewController”类。谢谢【参考方案3】:

根据PatternDetailViewController 中的viewDidLoad() 判断,您似乎正在使用导航控制器。

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

像这样获取 PatternDetailViewController:

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

【讨论】:

在传递数据时这对我有用!谢谢!【参考方案4】:

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

    在情节提要中找到源场景。转到 Identity Inspector(右侧面板中的第三个选项卡) 从身份检查器中删除(剪切/ctrl+x)“自定义类”下的“类”。 切换到另一个场景。 切换回源场景。 粘贴您刚刚删除的自定义类模块。 退出 XCode。 打开 Xcode。 干净。 构建。

为什么有效?我在复制粘贴别人的作品。在有一个具有该名称的类之前,我可能在右侧面板中写了类名称。我的猜测是 Swift 不能动态地找到这些东西。你必须表现得像它希望的那样。你必须按照一定的顺序做某些事情。

【讨论】:

【参考方案5】:

如果您从其他项目复制 Storyboard 文件并且未更改 Module ,则可能会发生此问题。

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

快乐编码:)

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

我的问题是:

不工作

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

工作

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

【讨论】:

【参考方案8】:

尝试干净 产品 > 清洁

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

【讨论】:

点评来源: 嗨,这篇文章似乎没有为问题提供quality answer。请编辑您的答案并改进它,或者将其作为评论发布。 请解释为什么您认为清理构建文件夹可以解决这个转换问题。

以上是关于无法将 UIViewController 类型的值转换为 PatternDetailViewController的主要内容,如果未能解决你的问题,请参考以下文章

无法将“testViewController.Type”类型的值转换为预期的参数类型“UIViewController”

无法将“ViewController.Type”类型的值转换为预期的参数类型“UIViewController”

无法将“ViewController.Type”类型的值转换为预期的参数类型“UIViewController”

无法将“UIViewController”类型的值转换为“name.mainVC” - 信号 SIGABRT

无法将'ViewController.Type'类型的值转换为预期的参数类型'UIViewController'

无法将类型“类”的值分配给类型“[类]”